数値の計算と演算子
計算のために用いる記号を演算子と言い、Cは豊富な演算子を持つことで有名です。ここでは基本的な数値計算で用いる算術演算子を紹介しておきます。
scanf関数
前回、キーボードから入力した値の10倍を計算して表示するプログラムのソースを紹介しました(リスト1:一般的なCのソースのみ掲げておきます)。その中で、値の入力を受け付けるためにscanf関数を使いました。
scanf関数の一般的な書式を紹介しておきましょう。
scanf(<書式指定文字列>, <変数リスト>);
<書式指定文字列>には、printf関数の書式指定文字列とほぼ共通の%記号を使った入力値の型指定文字列を指定します。サンプルの“%d”は10進整数を意味します。これに対応する形で、第2引数の<変数リスト>には入力された値を受け取る変数のアドレス(メモリ上の場所)を指定します。
<書式指定文字列>で3個の値入力を指定したら、<変数リスト>にもそれに対応する順序で3個の変数を指定しなければなりません。
<書式指定文字列>で%dとして10進整数を指定すれば、<変数リスト>ではそれに対応して10進数を受け取れる型の変数――一般にはshort intまたはlong int――を指定します。
<変数リスト>に指定するのは、変数名ではなくそのアドレスです。scanf関数はアドレスで示されたメモリ上の場所に、入力された値を保存します。変数のアドレスは、変数名の前にアドレス演算子“&”を付け足すことで取得できます。
num → 変数の保持している値
&num → 変数のアドレス
リスト1:入力した値の10倍を表示するプログラム(標準的なCのソース)
#include <stdio.h>
int main(void)
{
int num;
printf("Input number : ");
scanf("%d", &num);
printf("%d * 10 = %d\n", num, num * 10);
return (0);
}
算術演算子
このソースでscanf関数によって入力された値を10倍しているのは、以下の1行です。
printf("%d * 10 = %d\n", num, num * 10);
printf関数で計算結果を表示する箇所で、書式指定文字列の2番目に登場する“%d”に対応する第3引数“num * 10”(アンダーラインの箇所)で、変数numの値を10倍しています。
上記の式の“*”記号が乗算を表しています。加減乗除の四則演算は計算の基本で、これらのための記号を四則演算子と呼び、演算子の左側の値を「左辺値」、右側の値を「右辺値」と言います。
また、四則演算の他に剰余の演算子があり、これらを総称して算術演算子と呼びます。表1にCの算術演算子を掲げておきます。
表1:Cの算術演算子
記号 |
働き |
例 |
+ |
加算:左辺値と右辺値を加算する |
x + y |
- |
減算:左辺値から右辺値を減算する |
x - y |
* |
乗算:左辺値に右辺値を乗算する |
x * y |
/ |
除算:左辺値を右辺値で除算する |
x / y |
% |
剰余:左辺値を右辺値で除算した余 |
x % y |
計算式を書き換える
演算子を書き換えて、異なる計算をさせてみましょう。
上記の“num * 10”の箇所を“num + 10”に変更すれば10を加算した値が表示されます。ソースはリスト2、実行結果は以下のようになります(“3”と入力した場合)。
Input number : 3
3 + 10 = 13
リスト3のようにすれば、除算の/と剰余の%を使って、入力した値を3で割った値とその余を表示できます、実行結果は以下のようになります(“10”と入力した場合)。
Input number : 10
10 / 3 = 3, surplus : 1
リスト2:入力した値に10を加算して表示するプログラム(標準的なCのソース)
#include <stdio.h>
int main(void)
{
int num;
printf("Input number : ");
scanf("%d", &num);
printf("%d + 10 = %d\n", num, num + 10);
return (0);
}
リスト3:入力した値を3で割って商と余を表示するプログラム(標準的なCのソース)
#include <stdio.h>
int main(void)
{
int num;
printf("Input number : ");
scanf("%d", &num);
printf("%d / 3 = %d, surplus : %d\n", num, num / 3, num%3);
return (0);
}
演算子の優先順位
演算子には「どの演算子を使った式を先に実行するか」という優先順位があります。基本は小学校の算数で習ったとおりで、
乗算(*)・除算(/)・剰余(%)
が
加算(+)・減算(-)
より優先
という形です。
乗算・除算・剰余のグループには優先順位はなく、登場順(左からの記述順)に計算されます。加算と減算のグループも同じです。
ある式の計算を先に実行させたいときには、これも算数で習ったとおり、式を()で囲みます。
a + b * c; → b * cが先に計算され、その結果にaが加算される
(a + b) * c; → ()内のa + bが先に計算され、その結果にcが乗算される
|