5. いろいろな演算子(1/2)
5.1 論理演算子
条件分岐の条件で、複数の条件が組み合わさっている場合があります。例えば「番号の値が1から4の範囲」というような場合です。これは、もう少し詳しく書くと「番号の値が1以上かつ、4以下」という条件になります。このような条件を指定するための演算子を論理演算子と呼んでいます。
論理演算子には論理積(かつ:AND)、論理和(または:OR)、否定(NOT)の3種類があります。
5.1.1 形式
論理積は&&(アンパサンド2つ)、論理和は||(縦線2つ)、否定は!(感嘆符)を使用します。
条件1 && 条件2
条件1 || 条件2
! 条件
- 条件1 && 条件2
- 条件1が真かつ、条件2が真の場合は真になり、それ以外は偽になります。(条件1と条件2が真の場合は真になります)
- 条件1 || 条件2
- 条件1または、条件2が真の場合は真になり、それ以外は偽になります。(条件1と条件2のどちらか一方が真の場合は真になります)
- ! 条件
- 条件の真偽を反転します。(条件が真の場合は偽に、偽の場合は真になります)
これらの演算子は複数組み合わせて使用することが出来ます。
5.1.2 例題
例題1
メニューに表示される計算の種類を指定する記号(+、-、*、/)と、2つの数値を入力し、計算結果を出力します。最初に記号のチェックを行い、正しいときは計算結果を出力し、不当な場合はメッセージを出力します。
#include <stdio.h>
int main()
{
char enzansi;
double atai1;
double atai2;
printf("四則演算を行います\n");
printf("演算子を入力してください ==> ");
scanf("%c", &enzansi);
/* 入力した演算子のチェック */
if (enzansi == '+' || enzansi == '-' || enzansi == '*' || enzansi == '/')
{
printf("2つの値を入力してください ==> ");
scanf("%lf%lf", &atai1, &atai2);
/* 演算子により、処理を振り分ける */
switch (enzansi)
{
case '+':
/* 加算 */
printf("%lf + %lf = %lf\n", atai1, atai2, atai1 + atai2);
break;
case '-':
/* 減算 */
printf("%lf - %lf = %lf\n", atai1, atai2, atai1 - atai2);
break;
case '*':
/* 乗算 */
printf("%lf × %lf = %lf\n", atai1, atai2, atai1 * atai2);
break;
case '/':
/* 除算 */
printf("%lf ÷ %lf = %lf\n", atai1, atai2, atai1 / atai2);
break;
}
}
else
{
printf("演算子が不当です\n");
}
return 0;
}
$ ./ex05_1.prg
四則演算を行います
演算子を入力してください ==> +
2つの値を入力してください ==> 10 20
10.000000 + 20.000000 = 30.000000
$ ./ex05_1.prg
四則演算を行います
演算子を入力してください ==> /
2つの値を入力してください ==> 10 20
10.000000 ÷ 20.000000 = 0.500000
$ ./ex05_1.prg
四則演算を行います
演算子を入力してください ==> ^
演算子が不当です
$
- 10行目
- 計算の種類を指定する記号(+、-、*、/)を入力します。
- 13行目
- 入力した記号のチェックを行います。記号が「+または、-または、*または、/」の条件が真の場合は計算結果を出力し、偽の場合はメッセージを出力します。
- 19行目
- 変数enzansiはchar型ですが、char型は整数型の一種ですので、switch文で取り扱えます。
例題2
肥満度(BMI)のめやすは18.5〜25.0(18.5以上でかつ、25.0未満)の範囲が普通(標準値)で、18.5未満はやせすぎ、25.0以上は太り過ぎといわれています。そこで、BMIの値が18.5〜25.0(18.5以上でかつ、25.0未満)の範囲の場合は「肥満度は標準値の範囲です」を、それ以外の場合は「肥満度は標準値の範囲を超えています。やせすぎ、太り過ぎに注意しましょう」のメッセージを出力します。
#include <stdio.h>
int main()
{
double taijyu;
double sinchyo;
double bmi;
printf("肥満度(BMI)の計算を行います\n");
printf("体重(kg)と身長(m)を入力してください ==> ");
scanf("%lf%lf", &taijyu, &sinchyo);
/* 肥満度(BMI) = 体重(kg) / 身長(m) / 身長(m) */
bmi = taijyu / sinchyo / sinchyo;
printf("肥満度は%.2fです\n", bmi);
/* BMIのチェック */
if (bmi >= 18.5 && bmi < 25.0)
{
printf("肥満度は標準値の範囲です\n");
}
else
{
printf("肥満度は標準値の範囲を超えています。やせすぎ、太り過ぎに注意しましょう\n");
}
return 0;
}
$ ./ex05_2.prg
肥満度(BMI)の計算を行います
体重(kg)と身長(m)を入力してください ==> 65.5 1.75
肥満度は21.39です
肥満度は標準値の範囲です
$ ./ex05_2.prg
肥満度(BMI)の計算を行います
体重(kg)と身長(m)を入力してください ==> 88.0 1.75
肥満度は28.73です
肥満度は標準値の範囲を超えています。やせすぎ、太り過ぎに注意しましょう
$ ./ex05_2.prg
肥満度(BMI)の計算を行います
体重(kg)と身長(m)を入力してください ==> 55.5 1.8
肥満度は17.13です
肥満度は標準値の範囲を超えています。やせすぎ、太り過ぎに注意しましょう
$
- 17行目
- 変数bmiの値が18.5〜25.0(18.5以上でかつ、25.0未満)の条件が真の場合は標準値ですので、その旨のメッセージを出力します。
5.2 条件演算子
通常、条件判定はif文を使うことが多いのですが、条件判定のための演算子も用意されています。単純な条件の場合は条件演算子を使った方が簡潔に表現できます。
5.2.1 形式
条件演算子は?(疑問符)と:(コロン)を使用します。指定の仕方が通常の演算子と異なりますので注意してください。
式1 ? 式2 : 式3
- 式1
- 通常は条件演算子や論理演算子を使った式を指定しますが、四則演算子を使った式や、変数1個だけでも構いません。式の値が0の場合は偽で、0以外の場合は真です
- 式2
- 式1が真の場合に実行する式を指定します。この式の値が全体の式の値になります。
- 式3
- 式1が偽の場合に実行する式を指定します。この式の値が全体の式の値になります。
条件演算子は次のif文と同じような意味です。
if (式1)
式2;
else
式3;
5.2.2 例題
月の日数を出力します。ただし、閏年は考慮していません。
#include <stdio.h>
int main()
{
int tuki;
int nisuu;
printf("月の日数を求めます\n");
printf("何月ですか ==> ");
scanf("%d", &tuki);
/* 入力した月のチェック */
if (tuki >= 1 && tuki <= 12)
{
if (tuki == 2)
{
/* 2月 */
nisuu = 28;
}
else
{
/* 2月以外。4、6、9、11月は30日、それ以外は31日 */
nisuu = tuki == 4 || tuki == 6 || tuki == 9 || tuki == 11 ? 30 : 31;
}
printf("%d月の日数は%d日です\n", tuki, nisuu);
}
else
{
printf("月の値が不当です\n");
}
return 0;
}
$ ./ex05_3.prg
月の日数を求めます
何月ですか ==> 3
3月の日数は31日です
$ ./ex05_3.prg
月の日数を求めます
何月ですか ==> 2
2月の日数は28日です
$
- 22行目
- 右辺の式の値は条件「
tuki == 4 || tuki == 6 || tuki == 9 || tuki == 11
」が真のとき30に、偽のとき31になります。