Linux講座にようこそ。このページは「C言語プログラミング入門 - 第3章 四則演算をするための演算子」です。

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

3. 四則演算をするための演算子(2/2)

3.3 乗除算

ここでは四則演算のうち、乗算と除算について説明します。これらは日常の計算では×記号と÷記号を使いますが、キーボード上にはこれらの記号はありませんので、C言語では別の記号を演算子として使用します。また、除算の場合は演算子が2つ(/と%)ありますので使い分けが必要です。

3.3.1 形式

乗算は*(アステリスク)、除算は/(斜線)を演算子として使用します。ただし、整数型の除算の場合は/演算子はが、%演算子は余りが求まります。

値1 * 値2
値1 / 値2
値1 % 値2
値1 * 値2
値1と値2の乗算を行います。
値1 / 値2
値1から値2の除算を行います。値1と値2が整数型の場合は商が求まります。
値1 % 値2
値1と値2が整数型の場合は余りが求まります。実数型の場合はコンパイルエラーになります。

値1と値2の型名が異なっている場合は加減算と同じく、精度が高い方に型変換して演算を行います。

3.3.2 例題

2つの値を入力して、乗算と除算を行うプログラムです。浮動小数点型の除算の場合は余りも求めます。

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int     atai_1;
  5.     int     atai_2;
  6.     double  atai_3;
  7.     double  atai_4;
  8.  
  9.     /* 整数の計算 */
  10.     printf("整数の乗除算を行います\n");
  11.     printf("整数の値を2つ入力してください ==> ");
  12.     scanf("%d%d", &atai_1, &atai_2);
  13.     printf("%d * %d = %d\n", atai_1, atai_2, atai_1 * atai_2);
  14.     printf("%d / %d = %d\n", atai_1, atai_2, atai_1 / atai_2);
  15.     printf("%d %% %d = %d\n", atai_1, atai_2, atai_1 % atai_2);
  16.  
  17.     /* 実数の計算 */
  18.     printf("浮動小数点数の乗除算を行います\n");
  19.     printf("浮動小数点数の値を2つ入力してください ==> ");
  20.     scanf("%lf%lf", &atai_3, &atai_4);
  21.     printf("%f * %f = %f\n", atai_3, atai_4, atai_3 * atai_4);
  22.     printf("%f / %f = %f\n", atai_3, atai_4, atai_3 / atai_4);
  23.  
  24.     return 0;
  25. }
$ ./ex03_4.prg ← 上記例題を実行します
整数の乗除算を行います
整数の値を2つ入力してください ==> 10 3
10 * 3 = 30
10 / 3 = 3
10 % 3 = 1 ← 10 ÷ 3の余りを求めます
実数の乗除算を行います
実数の値を2つ入力してください ==> 10.0 3.0
10.000000 * 3.000000 = 30.000000
10.000000 / 3.000000 = 3.333333
$
13行目
入力した整数値と乗算結果を出力します。
14行目
入力した整数値と除算結果を出力します。整数型の演算のため商を出力します。
15行目
入力した整数値と除算結果の余りを出力します。printf関数の書式文字列中の「%%」は「%」を文字として出力するための指定です。
21行目
入力した浮動小数点値と乗算結果を出力します。
22行目
入力した浮動小数点値と除算結果を出力します。

3.4 その他の演算子および、関連事項

今まで説明してきた演算子以外でよく使う演算子と、それに関連する下記の事項を説明します。

  • 複合代入演算子
  • インクリメント、デクリメント演算子
  • 優先順位の変更

3.4.1 複合代入演算子の形式

右辺の値を左辺の変数に代入する代入演算子は既に説明しましたが、演算の種類と代入を同時に指定する複合代入演算子も用意されています。これらをうまく使用すると、プログラムがより簡潔に記述できます。

変数 += 値
変数 -= 値
変数 *= 値
変数 /= 値
変数 %= 値
変数 += 値
左辺の変数の式の値に右辺の値を加算します。「変数 = 変数 + 値」と同じ意味です。
変数 -= 値
左辺の変数の式の値から右辺の値を減算します。「変数 = 変数 - 値」と同じ意味です。
変数 *= 値
左辺の変数の式の値に右辺の値を乗算します。「変数 = 変数 * 値」と同じ意味です。
変数 /= 値
左辺の変数の式の値を右辺の値で除算します。「変数 = 変数 / 値」と同じ意味です。
変数 %= 値
左辺の変数の式の値を右辺の値で除算した結果の余りを求めます。変数と値は整数型に限ります。「変数 = 変数 % 値」と同じ意味です。

3.4.2 インクリメント、デクリメント演算子の形式

一般的に、プログラム中では変数に1を加算したり、1を減算することが頻繁に行われます。このため、C言語では1を加算するためのインクリメント演算子と、1を減算するためのデクリメント演算子が用意されています。

++変数
変数++
--変数
変数--
++変数
変数の値(内容)と、「++変数」の式の値は1を加算した値になります。
変数++
変数の値(内容)は1を加算した値になりますが、「変数++」の式の値は加算前の値のままです。
--変数
変数の値(内容)と、「--変数」の式の値は1を減算した値になります。
変数--
変数の値(内容)は1を減算した値になりますが、「変数--」の式の値は減算前の値のままです。

変数に1を加えるだけであれば「++変数」でも「変数++」でも結果的には同じですが、式の値も使う場合は結果が異なります。例えば、変数「atai」に10が設定されている場合の結果を示します。

kotae = ++atai; ← 変数「kotae」には「++atai」の式の値の11が代入されます。
          ↑ 変数「atai」の値は11になります。
kotae = atai++; ← 変数「kotae」には「atai++」の式の値の10が代入されます。
          ↑ 変数「atai」の値は11になります。
kotae = --atai; ← 変数「kotae」には「--atai」の式の値の9が代入されます。
          ↑ 変数「atai」の値は9になります。
kotae = atai--; ← 変数「kotae」には「atai--」の式の値の10が代入されます。
          ↑ 変数「atai」の値は9になります。

3.4.3 優先順位の変更

加減算と乗除算の混合演算の場合、乗除算を先に演算しなければなりませんが、C言語の演算子には優先順位が定義されていますので、通常は優先順位を余り考慮する必要はありません。しかし、複雑な演算の場合は優先順位を変更したいこともありますし、明示的に優先順位を指定したいこともあります。優先順位の指定は算数と同じく、((左小括弧)と)(右小括弧)で括ります。複雑な式の場合は明示的に括弧で括って、優先順位を明確にするのが良いでしょう。

なお、全ての演算子の優先順位については「付録2.演算子の優先順位」をご覧ください。

3.4.4 例題

3人の肥満度(BMI)の計算を行うプログラムです。肥満度は次の計算式で行います。

肥満度(BMI)= 体重(キログラム)÷ 身長(メートル)÷ 身長(メートル)

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int     bango = 0;
  5.     double  taijyu;
  6.     double  sinchyo;
  7.     double  bmi;
  8.     double  bmi_gokei = 0.0;
  9.  
  10.     /* 肥満度(BMI) = 体重(kg) * 身長(m) / 身長(m) */
  11.     printf("肥満度(BMI)の計算を行います\n");
  12.     /* 一人目の肥満度の計算 */
  13.     printf("%d人目の方の体重(kg)と身長(m)を入力してください ==> ", ++bango);
  14.     scanf("%lf%lf", &taijyu, &sinchyo);
  15.     bmi = taijyu / sinchyo / sinchyo;
  16.     printf("%d人目の方の肥満度は%.2fです\n", bango, bmi);
  17.     bmi_gokei += bmi;
  18.  
  19.     /* 二人目の肥満度の計算 */
  20.     printf("%d人目の方の体重(kg)と身長(m)を入力してください ==> ", ++bango);
  21.     scanf("%lf%lf", &taijyu, &sinchyo);
  22.     bmi = taijyu / sinchyo / sinchyo ;
  23.     printf("%d人目の方の肥満度は%.2fです\n", bango, bmi);
  24.     bmi_gokei += bmi;
  25.  
  26.     /* 三人目の肥満度の計算 */
  27.     printf("%d人目の方の体重(kg)と身長(m)を入力してください ==> ", ++bango);
  28.     scanf("%lf%lf", &taijyu, &sinchyo);
  29.     bmi = taijyu / sinchyo / sinchyo;
  30.     printf("%d人目の方の肥満度は%.2fです\n", bango, bmi);
  31.     bmi_gokei += bmi;
  32.  
  33.     /* 肥満度の平均値の計算 */
  34.     printf("\n肥満度の平均値は%.2fです\n", bmi_gokei / 3.0);
  35.  
  36.     return 0;
  37. }
$ ./ex03_5.prg ← 上記例題を実行します
肥満度(BMI)の計算を行います
1人目の方の体重(kg)と身長(m)を入力してください ==> 84.0 1.87
1人目の方の肥満度は24.02です
2人目の方の体重(kg)と身長(m)を入力してください ==> 68.0 1.84
2人目の方の肥満度は20.09です
3人目の方の体重(kg)と身長(m)を入力してください ==> 75.0 1.86
3人目の方の肥満度は21.68です

肥満度の平均値は21.93です
$
13行目
変数bangoには初期値として0を設定していますので、1を加算していくことで「1人」、「2人」、「3人」とメッセージに出力します。ここでは式の値を使いますので、++はbangoの前に付けています。また、「bango = bango + 1」や「bango += 1」と記述しても同じです。
15行目
「肥満度(BMI)= 体重(キログラム)÷ 身長(メートル)÷ 身長(メートル)」の計算式を使って肥満度の計算を行います。身長の単位はメートルですので注意してください。
17行目
最後に平均値を算出するために、計算した肥満度の値を変数bmi_gokeiに加算していきます。bmi_gokeiには初期値として0.0を設定しています。「bmi_gokei = bmi_gokei + bmi;」と記述しても同じです。
34行目
肥満度の合計を3で除算することで平均値を算出します。bmi_gokeiはdouble型(浮動小数点)ですので、型を合わせるために3.0と指定しています。