Thinkers'Studio
JavaとC言語の自習ツール
演算子の結合規則を知っておこう(C言語版)
 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(||)の次のポイントと併せて、その理由を確認しておきましょう。
  1. and の方が or より優先順位が高い。
  2. and も or も前のオペランドから評価される。
  3. and の場合は false なら評価を止める。
  4. 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 で、平年の判定。