この質問のコードを少し変更したバージョンを次に示します。
#pragma warning(default:4716)
int recur(int i)
{
int result;
result = (i>1 ? i - recur(i/2) : 3);
// return intentionally omitted
}
int main()
{
return recur(0);
}
recur()
省略されreturn
ているため、その動作は未定義であることに注意してください。このコードに対して Visual C++ 10 が出力するものは次のとおりです。
316: int main()
317: {
00403940 push ecx
318: return recur(0);
00403941 mov eax,dword ptr [esp]
319: }
00403944 pop ecx
00403945 ret
はい、未定義の動作の場合は何でも許可されることを知っています。しかし、このコードは完全に無意味であり、コンパイラーはプログラムであるため、無意味なことは期待できません。
コンパイラはどのようにして完全に無意味なコードを発行するのでしょうか?