C言語の基礎

int a = 0, b = 0;
if (a++ && b++) { }
if (a++ || b++) { }
printf("%d %d\n", a, b);

&& と || の右側に b++ を書いた上のコードを実行したときの出力として、正しいものはどれか。

  1. A2 0
  2. B2 1
  3. 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++ が実行されると考えた場合の値です。どちらも左側で結果が決まるので、評価されません。
この分野を解く 分野ページへ

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

C言語の基礎のほかの問題

  1. break のない case を含む上の switch 文を実行したときの出力として、正しいものはどれか。
  2. 上のプログラムを実行したときの出力として、正しいものはどれか。
  3. 上の関数 f を3回続けて呼び出したとき、3回目の戻り値として正しいものはどれか。
  4. C言語で、(1) 関数の中で static を付けずに宣言した局所変数、(2) malloc で確保した領域、(3) 関数の外で宣言した変数、のそれぞれが存在する期間(寿命)の組み合わせとして正しいものはどれか。
  5. int は32ビット(最大値 2147483647)とする。上の関数 fact(n) が、n の階乗をオーバーフローを起こさずに正しく返す最大の n はどれか。