C言語の基礎
int a = 0, b = 0;
if (a++ && b++) { }
if (a++ || b++) { }
printf("%d %d\n", a, b);&& と || の右側に b++ を書いた上のコードを実行したときの出力として、正しいものはどれか。
- A2 0
- B2 1
- C2 2
答えと解説を見る
正解:A. 2 0
&& は左側が偽なら、|| は左側が真なら、右側を評価しません(短絡評価)。1つ目の if では、a++ の値は増やす前の0で偽なので b++ は実行されず、a だけが1になります。2つ目の if では、a++ の値は1で真なので、やはり b++ は実行されず、a が2になります。右側に ++ や関数の呼び出しのような副作用のある式を書くと、実行されるかどうかが左側の値で変わる点に注意します。
- A. 正しい。どちらの if でも、右側の b++ は実行されません。
- B. どちらかの if で b++ が1回だけ実行されると考えた場合の値です。どちらも左側で結果が決まるので、評価されません。
- C. 両方の b++ が実行されると考えた場合の値です。どちらも左側で結果が決まるので、評価されません。