例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) と
解釈される。ちなみに、論理演算も左結合的である。