15 トレース問題1(if 文)

コードを実行前に手元で追って出力を予測してから答えを選ぼう。
「トレース表を見る」を開くと変数の変化を確認できる。

✅ トレースのコツ:変数を行、処理ステップを列に並べて左から右へ追う。
条件式が真か偽かを先に確認してから値を更新していく。

問1. 次のプログラムの出力として正しいものはどれか。

#include <stdio.h>
int main(void)
{
    int x = 10, y = 3, z = 0;
    if (x > y) {
        z += x;
        if (x < 15) {
            z -= y;
        } else {
            z += y;
        }
    }
    printf("%d\n", z);
    return 0;
}
▶ トレース表を見る
変数初期値z += xz -= y出力
x101010
y333
z01077

x > y(10>3)→ 真 → z += x → z=10
x < 15(10<15)→ 真 → z -= y → z=10-3=7

解説を表示

正解:ウ(7)

x > y が真なので z += x(z=10)。次に x < 15 が真なので z -= y(z=7)。


問2. 次のプログラムの出力として正しいものはどれか。

#include <stdio.h>
int main(void)
{
    int a = 4, b = 6, r = 0;
    if (a < b) {
        r += b;
        a++;
        if (a == 5) {
            r -= 2;
        } else {
            r += 3;
        }
    }
    printf("%d\n", r);
    return 0;
}
▶ トレース表を見る
変数初期値r += ba++r -= 2出力
a4455
b6666
r06644

a < b(4<6)→ 真 → r+=b → r=6
a++(a=5)→ a==5 → 真 → r-=2 → r=4

解説を表示

正解:ア(4)

r+=b で r=6。a++ で a=5 になり a==5 が真 → r-=2 → r=4。


問3. 次のプログラムの出力として正しいものはどれか。

#include <stdio.h>
int main(void)
{
    int i = 1, j = 2, k = 0;
    if (i < j) {
        k = i + j;
    }
    if (k > 2) {
        k = k * 2;
    }
    printf("%d\n", k);
    return 0;
}
▶ トレース表を見る
変数初期値k = i + jk = k * 2出力
i111
j222
k0366

i < j(1<2)→ 真 → k = 1+2 = 3
k > 2(3>2)→ 真 → k = 3×2 = 6

解説を表示

正解:ウ(6)

2つの if が独立している点に注意。k=3 になった後、2つ目の if(k>2)も評価される。


問4. 次のプログラムの出力として正しいものはどれか。

#include <stdio.h>
int main(void)
{
    int x = 5, y = 5, z = 0;
    if (x == y) {
        z = x + y;
    } else {
        z = x - y;
    }
    if (z >= 10) {
        z *= 2;
    }
    printf("%d\n", z);
    return 0;
}
▶ トレース表を見る
変数初期値z = x + yz *= 2出力
x555
y555
z0102020

x == y(5==5)→ 真 → z = 5+5 = 10
z >= 10(10>=10)→ 真 → z *= 2 → z = 20

解説を表示

正解:エ(20)

x == y が真 → z=10。次の if で z>=10 も真 → z*=2 → z=20。