6.1.2 論理 and

        例3
                if ( (a>0) && (b>0) ){
                        printf("a > 0 かつ b > 0 \n");
                }

この例では、「 $a>0$ かつ $b>0$ 」の場合に条件が真となる。実は、今の場合 関係演算は && よりも優先度が高いので丸括弧はなくても問題ないが、前述 の理由で慣れるまでは、つけておいた方が良いであろう。

        例4
                a = 1;
                if ( a<0 && scanf("%d", &a) ){
                        printf("おかしな例\n");
                }

論理 and や論理 or 演算では左の値が評価されてから、右の値を評価する。 ところが、論理 and では一つでも偽があれば全体の値も偽になるので、もし 左の値が偽であれば右の値の評価は必要ではない。そこでそのような場合は、 右の値を評価しないようになっている。今の例は少し変な例なのだが、a は 1 なので、左の $a<0$ は偽である。従って、右の scanf は実行されない点に 注意しよう。

参考 式の各項の評価の順序は、演算子の優先度と結合規則によって決定される。 a - b + c を考えた場合、-+ は同じ優先度 を持っている。従って、その順序は、結合規則によって決まる。結合規則には、 左結合的なものと右結合的なものがある。四則演算は、左結合的なので、 b は右側の + ではなく、左側の - に結合する。 その結果、(a - b) + c と解釈される。反対に、= などは、 右結合的である。従って、a = b = c は、a = (b = c) と 解釈される。ちなみに、論理演算も左結合的である。



最初のページ 戻る 次へ 最後のページ 目次
Hiroyasu Asami