Thinkers'Studio
JavaとC言語の自習ツール
演算子の結合規則を知っておこう(Java版)
 演算子はそれぞれ優先度と結合規則が決まっており、複数の演算子が現われる式でもその評価順は一定です。

優先度が同じなら結合規則で評価順が決まる

 同じ優先度の演算子が並ぶときは結合規則で決まります。
 結合規則は「左から右」「右から左」のどちらに結合させるかです。

 結合規則 例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 となります。

(今回のクイズ)
 下のプログラムを実行すると、x, y の値として何が表示されるでしょうか?
class CalcSample {
    public static void main( String[] args ) {
        int x, y, a = 100, b = 50;

        x = y = -a + b * 4 / 2;
        System.out.println( "x = " + x + ", y = " + y );
    }
}
 計算自体は簡単ですが、演算子の優先度や結合規則を意識しましょう。

 計算式には、次の演算子が含まれています。
優先度優先度の同じグループ結合規則
-単項演算子右から
/ *乗除演算子左から
+ -加減演算子左から
=代入演算子右から
   (答えは、次回の Java の 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 で、平年の判定。