課題28


  1. A && B という論理演算式において、 A が偽なら B の値に関係なく A && B は偽であることは明白なので、 この場合は B は評価(計算)されません。 つまり B は A が真の時のみ評価されます。

  2. 同様に A || B という論理演算式において、 A が真なら B の値に関係なく A || B は真であることは明白なので、 この場合は B は評価されません。 つまり B は A が偽の時のみ評価されます。

  3. この規則を応用して、次のような論理演算式を書くことができます。
    x < 0 && x = -x;
    
    これは if (x < 0) x = -x; と同じ動作をします。 この論理演算式の値(真か偽か)は使われません。

  4. 次のソースプログラムを kadai28.c というファイル名で作成してください。

    /*
    ** プログラム名: kadai28
    ** 動作: 論理演算式の評価順序
    ** 作者: 自分の名前、学籍番号
    ** 日付: 今日の日付
    */
    #include <stdio.h>
    
    int main(void)
    {
        int x = 0, y = 0;
    
        /* 1回目 */
        if (++x < 2 || ++y >= 2) {
            printf("x=%d,y=%d\n", x, y);
        }
    
        /* 2回目 */
        if (++x < 2 || ++y >= 2) {
            printf("x=%d,y=%d\n", x, y);
        }
    
        /* 3回目 */
        if (++x < 2 || ++y >= 2) {
            printf("x=%d,y=%d\n", x, y);
        }
    
        return 0;
    }
    

  5. このソースプログラムをコンパイル/リンクし、 kadai28 という名前の実行プログラムを作成した後、 kadai28 を実行して出力を確かめてください。

  6. このプログラムが仮に if の条件内で x と y が 同時に1ずつ増えていくことを想定して作られているとすると、 次のような出力が期待できます。
    x=1,y=1
    x=2,y=2
    x=3,y=3
    
    しかし実際の出力は上のようにはなりません。 その理由を考察して、メールで tokoiまで送ってください。 Subject: は kadai28 としてください。