Linux講座にようこそ。このページは「C言語プログラミング入門 - 第5章.いろいろな演算子」です。

C言語プログラミング入門

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つの数値を入力し、計算結果を出力します。最初に記号のチェックを行い、正しいときは計算結果を出力し、不当な場合はメッセージを出力します。

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     char    enzansi;
  5.     double  atai1;
  6.     double  atai2;
  7.  
  8.     printf("四則演算を行います\n");
  9.     printf("演算子を入力してください ==> ");
  10.     scanf("%c", &enzansi);
  11.  
  12.     /* 入力した演算子のチェック */
  13.     if (enzansi == '+' || enzansi == '-' || enzansi == '*' || enzansi == '/')
  14.     {
  15.       printf("2つの値を入力してください ==> ");
  16.       scanf("%lf%lf", &atai1, &atai2);
  17.  
  18.       /* 演算子により、処理を振り分ける */
  19.       switch (enzansi)
  20.       {
  21.         case '+':
  22.             /* 加算 */
  23.           printf("%lf + %lf = %lf\n", atai1, atai2, atai1 + atai2);
  24.           break;
  25.           case '-':
  26.           /* 減算 */
  27.           printf("%lf - %lf = %lf\n", atai1, atai2, atai1 - atai2);
  28.           break;
  29.         case '*':
  30.           /* 乗算 */
  31.           printf("%lf × %lf = %lf\n", atai1, atai2, atai1 * atai2);
  32.           break;
  33.         case '/':
  34.           /* 除算 */
  35.           printf("%lf ÷ %lf = %lf\n", atai1, atai2, atai1 / atai2);
  36.           break;
  37.       }
  38.     }
  39.     else
  40.     {
  41.       printf("演算子が不当です\n");
  42.     }
  43.  
  44.     return 0;
  45. }
$ ./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未満)の範囲の場合は「肥満度は標準値の範囲です」を、それ以外の場合は「肥満度は標準値の範囲を超えています。やせすぎ、太り過ぎに注意しましょう」のメッセージを出力します。

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     double  taijyu;
  5.     double  sinchyo;
  6.     double  bmi;
  7.  
  8.     printf("肥満度(BMI)の計算を行います\n");
  9.     printf("体重(kg)と身長(m)を入力してください ==> ");
  10.     scanf("%lf%lf", &taijyu, &sinchyo);
  11.  
  12.     /* 肥満度(BMI) = 体重(kg) / 身長(m) / 身長(m) */
  13.     bmi = taijyu / sinchyo / sinchyo;
  14.     printf("肥満度は%.2fです\n", bmi);
  15.  
  16.     /* BMIのチェック  */
  17.     if (bmi >= 18.5 && bmi < 25.0)
  18.     {
  19.         printf("肥満度は標準値の範囲です\n");
  20.     }
  21.     else
  22.     {
  23.         printf("肥満度は標準値の範囲を超えています。やせすぎ、太り過ぎに注意しましょう\n");
  24.     }
  25.  
  26.     return 0;
  27. }
$ ./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 例題

月の日数を出力します。ただし、閏年は考慮していません。

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int tuki;
  5.     int nisuu;
  6.  
  7.     printf("月の日数を求めます\n");
  8.     printf("何月ですか ==> ");
  9.     scanf("%d", &tuki);
  10.  
  11.     /* 入力した月のチェック */
  12.     if (tuki >= 1 && tuki <= 12)
  13.     {
  14.       if (tuki == 2)
  15.         {
  16.         /* 2月 */
  17.         nisuu = 28;
  18.       }
  19.       else
  20.       {
  21.         /* 2月以外。4、6、9、11月は30日、それ以外は31日 */
  22.         nisuu = tuki == 4 || tuki == 6 || tuki == 9 || tuki == 11 ? 30 : 31;
  23.       }
  24.  
  25.       printf("%d月の日数は%d日です\n", tuki, nisuu);
  26.     }
  27.     else
  28.     {
  29.       printf("月の値が不当です\n");
  30.     }
  31.  
  32.     return 0;
  33. }
$ ./ex05_3.prg
月の日数を求めます
何月ですか ==> 3
3月の日数は31日です
$ ./ex05_3.prg
月の日数を求めます
何月ですか ==> 2
2月の日数は28日です
$
22行目
右辺の式の値は条件「tuki == 4 || tuki == 6 || tuki == 9 || tuki == 11」が真のとき30に、偽のとき31になります。