例3 if ( (a>0) && (b>0) ){ printf("a > 0 かつ b > 0 \n"); } |
この例では、「 かつ
」の場合に条件が真となる。実は、今の場合
関係演算は && よりも優先度が高いので丸括弧はなくても問題ないが、前述
の理由で慣れるまでは、つけておいた方が良いであろう。
例4 a = 1; if ( a<0 && scanf("%d", &a) ){ printf("おかしな例\n"); } |
論理 and や論理 or 演算では左の値が評価されてから、右の値を評価する。
ところが、論理 and では一つでも偽があれば全体の値も偽になるので、もし
左の値が偽であれば右の値の評価は必要ではない。そこでそのような場合は、
右の値を評価しないようになっている。今の例は少し変な例なのだが、a は
1 なので、左の は偽である。従って、右の scanf は実行されない点に
注意しよう。
参考 式の各項の評価の順序は、演算子の優先度と結合規則によって決定される。
a - b + c
を考えた場合、-
と +
は同じ優先度
を持っている。従って、その順序は、結合規則によって決まる。結合規則には、
左結合的なものと右結合的なものがある。四則演算は、左結合的なので、
b
は右側の +
ではなく、左側の -
に結合する。
その結果、(a - b) + c
と解釈される。反対に、=
などは、
右結合的である。従って、a = b = c
は、a = (b = c)
と
解釈される。ちなみに、論理演算も左結合的である。