第04回「変数の四則演算」

今回の理解目標

  • 変数の加減乗除
  • 四則演算の簡略表記
  • インクリメント・デクリメント



前回は変数に数値を代入する方法について解説しました。しかし、ただ数字を入れておくだけでは、正直変数の機能の一毛も使っていないといわざるを得ません。ということで今回は変数を使って四則演算をしてみましょう。



※四則演算
足し算、引き算、掛け算、割り算のこと。





変数の加減乗除

さて、加減乗除処理のうち足し算、引き算に関しては直感的に理解しやすいと思いますのでいきなりソースコードから載せてしまいます。

加減乗除
足し算、引き算、掛け算、割り算のこと。

ソースコード
プログラミング言語で書かれたプログラムのテキストファイルのこと。
わかりやすく換言すると、人間が書いたプログラムの文字列。
「では、次のプログラムを見てください」の「プログラム」と同義。

ということで以下のソースコードを見てください。

garbage + 110;
garbage - 119;

garbage変数はすでに宣言されているものとします。
見ての通り、そのままです。C言語なので最後にセミコロンはつけますがそのままです。もはや他に表現の仕様が無いほどにそのままです。
では、掛け算と割り算に関してはどうなのでしょうか。

garbage * 115;
garbage / 117;

残念ながらこちらは見ての通り、というようには行かないと思います。
C言語のようなプログラミング言語においては、掛け算を表す記号は「×」ではなく「*」を、割り算の記号「÷」ではなく「/」をそれぞれ使います。
何故こんなにわけのわからないことになっているかというと、理由としては代入記号が「←」ではなく「=」が使われているのと同じです。つまり、キーボードのどこを探しても×記号や÷記号はありません。よって、代わりに「*」や「/」を使って対応したのです。


四則演算、加減乗除はこのようにして行います。また、上の例では全て「変数と定数」の間での計算しか行っていませんが、変数と変数、定数と定数の計算も行うことができます。二つ以上つなげることも可能です。



※定数
53、87、634など普通の数字のこと。
変数と違い「変わらない定まった数」という意味で定数と呼ばれる。

例としてはこんな感じになります。

int garbage = 53;
int peepor = 110;
garbage + peepor;
7 + 7 + 7;

さて、これで四則演算ができる……ように見えますが、実は大きな落とし穴があります。ということで次項ではそれに関して解説いたします。




値の代入

四則演算のプログラムの組み方もわかったことですし、実際にプログラムを組んで見ましょう。

ということでこのように作成しました。コンパイルも通っています。では、実行結果を見てみましょう。

……あれ?
暗算すればわかると思いますが、53+117=170です。しかし、表示は53。これはどういうことか。コンピューターが計算ミスをしたのでしょうか? 実は、この処理では53と出るのは当然なのです。53、最初にgarbage変数に代入した数値です。つまり、これでは足し算はちゃんと行われていなかったということになります。
とはいっても「ちゃんと」行われていなかっただけであり、足し算自体が行われていなかったのではありません。じつは、足し算処理は行われていたのですが、足し算によって生まれた「結果」がそのまま中へと消えてしまったのです。……と抽象的なことを言われても意味がわからないかと思いますので、どうすればいいのかを示しましょう。以下のように書いてください。

garbage = garbage + 117;

どういうことなのか解説しましょう。
「garbage + 117;」と書かれただけでは、そこに値、もしgarbage変数に53が入っていたとしたら170という値が「ある」だけでしかないのです。つまりプログラム中に

170;

と書かれているのと同じことなのです。これでは何も起きるはずがありません。
そこで、足し算して得られた結果をgarbage変数に代入することによって初めてgarbage変数に数字が加算されます。
上の例のように書くと

garbage = 170;

となった、ということです。
さて、ここで「何でgarbageにgarbageが代入されてから+117されて結局ただのgarbageにならないんだ!」と思ったかたもいらっしゃるかもしれません。この理由はただ単に「=」処理が最後に行われるからです。他にもいろいろな計算記号が出てくると、厳密には最後に代入が行われるとはいえなくなってしまうのですが、少なくとも「+」「-」「*」「/」「=」の五つの記号の中では「=」が一番最後に行われるように決められているので上のようなプログラムでうまく動くわけです。
さて、プログラムを変更してもう一度実行してみましょう。


このようにコンパイルも通り、実行結果もちゃんと170になりました。
この法則は足し算だけではなく引き算、掛け算、割り算でもちゃんと成り立ちます。


今度こそこれで四則演算がちゃんと行えるようになったのですが、正直変数の名前を二回書くのが面倒ではありませんか? そういうみなさんのために、C言語にはちゃんとこれを省略して表記する方法があります。
ということで次項はそれの解説となります。




簡略表記

四則演算で値を代入するときに、同じ変数名を二度も書くのは正直面倒です。C言語開発者側もそれはわかっていたようで、その変数にある数値を足したり引いたり掛けたり割ったりしたい場合は以下のような簡略表記を使うことができます。

garbage += 117;
garbage -= 110;
garbage *= 119;
garbage /= 171;

上のように、「変数名 演算子= 四則演算したい値 ;」のように書きます。
簡略しないで書くと上の例はそれぞれ

garbage = garbage + 117;
garbage = garbage - 110;
garbage = garbage * 119;
garbage = garbage / 171

と書かれていることになります。この表記を使えば同じ変数名を二度書くという煩わしいことをしなくても済みます。


またこれは現段階では読者のみなさんにはわからないことなのですが、プログラミングにおいては「変数の値を1だけ足したい」「変数の値を1だけ引きたい」ということが多々起きます。これは普通に上の簡略表記を使っても書くことができるのですが、このような必要性に答えてC言語には「1だけ足す・引く」専用の簡略表記も用意されています。それが以下の例です。

++garbage;
--garbage;
garbage++;
garbage--;

変数名の前か後ろに「++」をつけるとその変数の値が1増加、「--」をつけると1減少します。「++」の方をインクリメント、「--」の方をデクリメントと呼びます。
「何故同じ事をするのに前と後ろの両方の書き方があるんだ! 混乱して両方に書いたらどうしてくれるんだ!」と思う方もいらっしゃると思いますが、厳密な意味ではこの二つの表記は異なっているのですが普段はそんなことを意識することも無いと思いますので、使いたくなった場合は好きなほうをお使いください。
ちなみに自分にC言語を教えてくださった師匠(いや先輩ですが)の話によると、記号を後ろにつけるより前につけたほうが若干処理速度が速いそうです。どうしてそうなるのか自分でも理解していませんし検証もたしかあまり結果はでなかったので小文字で書かせていただきますが。




課題

以上で今回の内容は終了となります。次回までの一週間の間以下の課題プログラムを組むことで今回の内容を復習しておいてください。
1.変数を用意し、順番に「+2」「−4」「×8」「÷2」としていったときの計算結果を表示するプログラムを作成する。(%dの後に空白を入れないと数字のつながりがわかりにくくなるので注意)
2.「++」、「--」でそれぞれ変数の数値が1ずつ変化していることを確認するプログラムを作成する。(どのようなスタイルでも良い)
3.「++変数名++」や「--変数名++」など混ぜて使ったときにどうなるのかを確かめる。


今回の課題は内容に対して数は少なめですが、その代わり一つ一つのプログラム、特に課題1が長くなるように作成しました。難しい部分もあるかもしれませんが、そういう時はこの講座を読みながらがんばってプログラムを組んでみてください。
それでは、また来週の火曜日に。