コンパイラ
上の関数に、定数伝播・定数畳み込み・不要コードの削除を十分に行ったとき、関数が返す値と残るコードとして正しいものはどれか。
int h(void) {
int a = 5;
int b = a * 3;
int c = b - a;
if (c > 100) return 0;
return c * 2;
}
- A常に20を返し、if文の判定は削除される
- B常に0を返し、return c * 2 は削除される
- C計算はすべて残り、実行時に20か0を返す
答えと解説を見る
正解:A. 常に20を返し、if文の判定は削除される
a = 5 を伝播すると b = 5 * 3 = 15、c = 15 − 5 = 10 と畳み込めます。すると条件 c > 100 は 10 > 100 で常に偽と分かるので、return 0 の分岐は決して実行されない不要コードとして削除されます。残る return c * 2 は 10 × 2 = 20 となり、関数は return 20; だけになります。条件が常に偽なので0を返すことはなく、実行時に計算や判定をする必要もありません。
- A. 正しい。c = 10で条件は常に偽になり、20だけを返すコードになります。
- B. 条件は常に偽なので、0を返すことはありません。
- C. すべて定数で決まるので、実行時の計算は残りません。