② コード読み取り 6問
頭の中で実行 してから選択肢をクリック。間違えても解説を読めば必ず腑に落ちます。
Q1. else if の連鎖
int score = 85;
if (score >= 90) printf("S\n");
else if (score >= 80) printf("A\n");
else if (score >= 70) printf("B\n");
else printf("C\n");
出力は?
S
A
A B C
B
解説: 上から順にチェック。
① 85 >= 90 → 偽
② 85 >= 80 → 真! A を出力して、ここで終了
③ 残りの分岐はスキップ(B も出ない)
∴ A
Q2. = と == の取り違え
int a = 3;
if (a = 0) printf("A\n");
else printf("B\n");
printf("a=%d\n", a);
出力は?
A
a=3
B
a=3
A
a=0
B
a=0
解説: a = 0 は 代入。a に 0 が入ったうえで、その式の値(0)が条件として評価される。
0 は 偽 なので else 側へ → B。
その後 a の中身は 0 になっているので a=0 と表示される。
本当は a == 0 と書きたかった、というよくあるバグ。
Q3. 範囲の論理結合
int a = 7;
if (0 <= a && a < 10) printf("in\n");
else printf("out\n");
出力は?
in
out
何も出ない
コンパイルエラー
解説: a = 7 のとき。
① 0 <= 7 → 真
② 7 < 10 → 真
③ 真 && 真 → 真
∴ in。
※ 0 <= a < 10 と書くと意味が違うので注意(C言語では (0 <= a) < 10 と解釈される)。
Q4. switch の break 忘れ
int n = 2;
switch (n) {
case 1: printf("A ");
case 2: printf("B ");
case 3: printf("C ");
default: printf("D ");
}
出力は?
B
B C D
A B C D
B D
解説: n = 2 なので case 2 から実行が始まる。
各 case に break が無い ため、下に流れ続ける(fallthrough)。
case 2 → case 3 → default 全部実行されて B C D。
意図せぬ fallthrough を防ぐには、各 case の最後に必ず break;。
Q5. else の係り受け
int a = 0, b = 0;
if (a > 0)
if (b > 0) printf("both+\n");
else printf("a+ b不+\n");
else printf("a not+\n");
出力は?
both+
a+ b不+
a not+
何も出ない
解説: a = 0 なので最初の if (a > 0) は偽 → 一番外の else へ。
else は 一番近い if に係るので、ここでは外側の if に対応。
∴ a not+。
インデントが紛らわしいが、ぶら下がり else の規則どおり「外側 if の else」が実行される。
誤解を防ぐには 必ず { } を付ける。
Q6. switch の default だけが当たる
int n = 5;
switch (n) {
case 1: printf("one"); break;
case 2: printf("two"); break;
default: printf("other");
}
出力は?
one
two
other
何も出ない
解説: n = 5 はどの case にも当たらないので default に入る。
∴ other。
どの case にも当たらない時の 受け皿 として default を用意しておくと安全。