コンパイラ
上のコードに定数伝播と定数畳み込みを繰り返し行うと、最終的にどのようなコードになるか。
int n = 8;
int m = n * 2;
return m + 1;
- Areturn n * 2 + 1;
- Breturn 8 * 2 + m;
- Creturn 17;
答えと解説を見る
正解:C. return 17;
定数伝播では、nに8が入ったあと変更されないので、nを使う場所を8に置き換えて m = 8 * 2 とします。定数畳み込みで 8 * 2 を16に計算すると m = 16 になり、さらに伝播と畳み込みで m + 1 は 16 + 1 = 17 になります。nとmの代入は使われなくなるので不要コードとして削除され、return 17; だけが残ります。途中で止めた形や、置き換えを誤った形は最終の結果ではありません。
- A. nがまだ残っており、伝播が終わっていません。
- B. 置き換えを誤っており、計算も終わっていません。
- C. 正しい。8 → 16 → 17と計算が進み、定数だけが残ります。