这是此问题的代码的略微修改版本:
#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
是的,我知道在未定义行为的情况下,任何事情都是允许的。但是这段代码完全没有意义,编译器就是一个程序,所以我不会指望它会做出毫无意义的事情。
编译器如何设法发出完全无意义的代码?