第21回
Cの簡略記法~評価の順序を前提にしたシンプルな書き方

式の評価と値

「式」と「評価」という言葉は既に紹介しましたが、もう一度説明しておきましょう。『式』とは何らかの演算を行う命令で、その結果である値を返します。式を実行して値を得ることを(式の)『評価』と言い、値は評価の結果です。

式と評価

例えば
x = y * 100;
(b)   (a)
という式は「変数yの持つ値を100倍し(a)、その結果を変数xに代入せよ(b)」という命令で、これを実行すると変数xに「yの100倍の値」が代入されます。

単純に「式」と言いましたが、上記の命令には2つの式が存在しています。まず「y * 100」という「変数yの値を100倍する」命令(a)です。例えばyの値が「5」であれば、この式の結果は「500」となります。これが、この式の返す値です。

しかし、プログラミングではこの単純な式は意味を持ちません。式の結果が変数に受け継がれなければ、続く処理で利用できないからです。そこで代入演算子「=」を使って、先の式の値を変数xに代入することになります(b)。この代入命令もまた式です。

そして、代入される値──「y * 100」の結果が、この式全体の値となります。

関数の呼び出しと評価

関数の呼び出しもまた「式」であり、評価した結果が式の値となります。値を返さない関数(void型の関数)を呼び出すと、その評価結果は常に「真」となります。値を返す関数は、関数の返した値(戻り値)が式の評価結果となります。

通常、値を返す関数を呼び出したら、その結果を変数に受け取ります。そうやって関数の戻り値を受け取った変数の値を、ifやwhileの条件とする場合があります。例えば、
コンソール入力から1文字を受け取る関数getcharで受け取った1文字を、
if文で'Y'であるかどうか判断する。
という処理は、以下のように記述できます。
int c;
c = getchar(); ---------- 1文字を入力
if (c == 'Y') { ... ----- 'Y'かどうか調べる
この式は、先に説明した「代入式は代入された値を保持する」という規則に従えば、次のように1行にまとめられます。
if ((c = getchar()) == 'Y') { ...
        (a)          (b)
(a)で1文字を受け取り、(b)でその値(c = getchar()という式の値=cに代入されたgetchar関数の戻り値)が'Y'と等しいかどうかを調べています。


変数の省略

上記の処理の後で変数cの保持している値を利用するなら、このような書き方でも構いません。しかし、「単に入力された1文字が'Y'かどうか?」を調べるだけであれば(変数cの保持している値をこの箇所以外で利用しないのであれば)、さらに以下のように簡略化できます。
if ((getchar() == 'Y')) { ...
関数の戻り値を変数に代入するのは、その戻り値を別の処理でも利用する場合です。戻り値の利用(この場合はif文での判定)がその場限りであれば、わざわざ変数を介する必要はありません。


条件式の簡略化

ifやwhileの条件式では、
偽=0
真=0以外
という規則が適用されます。そこで、変数nの値が「0」でないかどうかを調べる場合、以下のような式が考えられます。
if (n != 0) { ...
「nの値が0ではない(!=0)」という比較演算の結果は、nが0なら「偽(0)」、nが0でなければ「真(0以外)」となります。従って、比較演算の結果と変数n値そのものとが同じであることになります。

従って、上の式は比較演算を省略して次のように記述できます。
if (n) { ...
変数nの値が
0ならifに続く{ }内の処理は実行されず
nの値が0でなければ{ }内の処理が実行される
という形は変わりません。