第4回
算術演算と変数~演算子と変数の型

計算結果の代入

このように、算術演算子の働きは小学校の算数で習ったとおりです。しかし、プログラミングの計算式は、我々が算数や数学で習ったものとは状況が少し異なります。

代入演算子

上のprint関数の例(リスト1)では、書式指定文字列内2番目の%dの位置に第2引数の計算式“num * 10”の結果が表示されました。が、一般的な処理では計算結果を変数に代入することが多くなります。

short int ans;
ans = num * 10; ---- 「num * 10」の結果を変数ansに代入
この場合の=記号は、左辺に右辺値を代入する役割を持っています。これを代入演算子と言います。

単純な足し算で考える

さて、この代入演算子「=」ですが、プログラミングでは我々の通常の感覚とは少し異なる使われ方をします。

例えば
久雄君の財布の中には100円入っています。
お母さんからお小遣いを50円もらいました。
久雄君の所持金はいくらでしょう?
という応用問題があったとします。

この問題は
100 + 50 = 150
という計算で簡単に解けます。

もう少しプログラムっぽく考えれば、
財布の中の所持金をxとして、計算式は
x + 50
となり、xは100なので
100 + 50 = 150
ということになりますし、財布の中の所持金をテーブルの上に置いたとすれば
テーブルの上の金額をxとして、同じように
x + 50
という計算式を作ることができます。

結果はどこに置かれるのか?

このように、人間の考える計算式では必ず『計算結果の置き場所』が存在します。しかし
x + 50
のような式ではその結果の置き場所が明示されません。

それなのにちゃんと『xが100だから答は150』などと計算できてしまうのは、我々が頭の中で財布の中やテーブルの上など『結果の置き場所』を勝手に想像しているからです。プログラムでは、以下のように計算式の結果を保存する場所を別途用意しなければなりません。
short int x, y;
x = 100;
y = x + 50;
printf("久雄君の所持金は %d 円です。", y);

結果を元の変数に返す式

しかし、プログラミングで計算結果の置き場所を別途用意するのは、どこか不自然で非効率的でもあります。久雄君の財布の中に50円を入れてしまえば、計算結果はそこ(財布に中)に存在することになります。上の例で言えば変数xがそれに該当します。

言葉で考えれば、「財布に50円を入れる」→「xに50を加算する」という形が自然です。つまり、被計算数に計算結果を保存するのが自然だということです。

そこで多くのプログラミング言語では、変数xに対する計算結果を変数xに保存するために、
x = x + 50;
のような式を記述できるようになっています。上の例を変数xだけで記述すれば、以下のようになります。
short int x;
x = 100;
x = x + 50;
printf("久雄君の所持金は %d 円です。", x);
しかし、これもまたどこかおかしい気がします。

x = x + 50;
という式は『xとx+50とが等価である』と読めてしまうからです。この場合の=は代入演算子であって等号ではありません。制御構造のときに説明しますが、Cでは等号は==となり、代入と区別できるようになっています。が、BASICではどちらも=記号なので、「?」となってしまうのです ※1

BASICでは、代入命令にはSET命令を使い『SET x = 100』のように記述しますが、SET命令は省略可能なのでこのような混乱が起きてしまいます

自然な計算ができる代入演算子

そこでCでは、被計算数に計算結果を代入するという、人間にとってはごく自然な処理を記述できる代入演算子が用意されています。

先の例を代入演算子で記述すると
x += 50;
という形になります。これは「変数xに50を加える」と読めるので、人間にとって非常に自然です。
short int x;
x = 100;
x += 50;
printf("久雄君の所持金は %d 円です。", x);

表2:Cの代入演算子
記号 働き
= 左辺に右辺値を代入する x = y * 10
+= 左辺値に右辺値を加算した値を左辺に代入する x += y
-= 左辺値から右辺値を減算した値を左辺に代入する x -= y
*= 左辺値と右辺値を乗算した値を左辺に代入する x *= y
/= 左辺値を右辺値で除算した値を左辺に代入する x /= y
%= 左辺値を右辺値で除算した余を左辺に代入する x %= y

インクリメントとデクリメント

また、代入演算子の特殊型として、インクリメント演算子++とデクリメント演算子--があります。これもまた「xを1増やす/1減らす」という自然な表現で捉えることができます。

インクリメント演算子は、forループでカウンタ変数を加算または減算する場合によく用いられます。forループについては、回を追って紹介しましょう。
for (i=0; i<100; i++) {
        : (繰り返し処理)
}
この他にも、Cには比較演算子、論理演算子、ビット演算子などたくさんの演算子があります。が、今は算術演算に絞って話を進めたいので、他の演算子については回を追って取り上げます。

表3:インクリメント演算子とデクリメント演算子
記号 働き
++ 左辺値に1を加算した値を左辺に代入する(インクリメント) x++
-- 左辺値から1を減算した値を左辺に代入する(デクリメント) x--