C言語の演算子は多数ありますが、優先度と
結合規則が決まっているので、複数の演算子を含む式も評価順が一定です。
優先度が同じなら結合規則で評価順が決まる
同じ優先度の演算子が並ぶときは
結合規則で決まります。
結合規則は「左から右」「右から左」のどちらに結合させるかです。
結合規則 例1) x = 48 / 8 / 2; ・・・ 「左から右」の除算演算子
左と結合するので x = ( 48 / 8 ) / 2; と同じ。
x = 48 / ( 8 / 2 ); の計算とは結果が違います。
結合規則 例2) x = y = 0; ・・・ 「右から左」の代入演算子
x = ( y = 0 ); と同じ。 y に 0 を代入しそれを x にも代入するので x も y も 0 となります。
(今回のクイズ)
次のプログラムは、ファイルをオープンしてひと文字ずつ読み込み、出力するものです。
赤の( ) がないと、プログラムが正しく動きません。その理由を考えてみましょう。
#include <stdio.h>
#include <stdlib.h>
main()
{
FILE *fp;
int c;
if( (fp = fopen( "data.txt", "r" )) == NULL ) {
printf( "ファイルがオープンできません\n" );
exit( 1 );
}
while( (c = fgetc( fp )) != EOF ) {
putchar( c );
}
fclose( fp );
}
|
(ヒント)
1箇所目の赤( ) ・・・ 関数 fopen の戻り値が NULL(ファイルオープンに失敗) なら、という判断で使用。
2箇所目 ・・・ ファイルからひと文字読む関数 fgetc の戻り値が、ファイルの終わり(EOF) でないか調べる処理で使用。
このプログラムには、次の演算子が含まれています。
優先度 | 優先度の同じグループ | 結合規則 |
高 | ( ) | 関数呼び出し | 左から |
: | == != | 等値演算子 | 左から |
低 | = | 代入演算子 | 右から |
(答えは、
次回のC言語の Tips で ・・・)
前回のクイズの答え:
(
前回の問題を見る )
うるう年判定の3つの条件はどこも ( ) で括る必要なく正しく評価できます。
論理演算子 and(&&)と or(||)の次のポイントと併せて、その理由を確認しておきましょう。
- and の方が or より優先順位が高い。
- and も or も前のオペランドから評価される。
- and の場合は false なら評価を止める。
- or の場合は true であれば評価を止める。
if( year % 4 == 0 && year % 100 != 0 || year % 400 == 0 )
a b c
1. と 2. により
a が先に評価される。
a でなければ 3. の理由で評価を止め、平年の判定。
a なら
b も満たすか判定しにいく。
b なら 4. の理由によりそこで評価を止め、うるう年の判定。
b でなければ
c はどうか調べに行く。
c なら、うるう年の判定。
c でなければ結局 false で、平年の判定。