[C言語] Cパズルブック 1.3 論理演算子とインクリメント演算子

『Cパズルブック』(Alan R.Feuer, 1985)
[M1 Mac, Big Sur 11.7.2, clang 13.0.0, NO IDE]

3番目以降は難問でした。

最後のz = x / ++ xは優先度3の除算と優先度2の前置インクリメントの関係を厳格に用いると先にインクリメントが実行され後で除算になるので4/4の1になりますが、実際の計算結果は3/4の商である0になります。

この計算式については除算が優先されています。gccもclangも同じ結果でした(コンパイラは一応下記警告を発していました)。本の解答はコンパイラ次第なので ? になっています。

#include <stdio.h>
#define PRINT(int) printf("%d\n",int)

int main() {
    int x , y, z;

    x = 2; y = 1; z = 0;
    x = x && y || x;        // (TRUE and TRUE) or TRUE = TRUE 1
    PRINT(x);               // 1
    PRINT(x || ! y && z);   // (TRUE or FALSE) or FALSE = TRUE 1

    x = y = 1;
    z = x ++ -1; // z = 1 - 1 後置インクリメントなのでx++評価後にxが2に増加する
    PRINT(x);   // 2
    PRINT(z);   // 0
    z += - x ++ + ++ y; // 0 + -(2) + 2
    PRINT(x);   // 3
    PRINT(z);   // 0
    z = x / ++ x; // z = 3/4 or 4/4
    PRINT(z);   // 0 or 1

    return 0;
}
src/test.c:19:13: warning: unsequenced modification and access to 'x' [-Wunsequenced]
    z = x / ++ x; // 3 / 4
        ~   ^
1 warning generated.