<分区>
这里是代码 from this question 的略微修改版本:
#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
是的,我知道在未定义行为的情况下,任何事情都是允许的。但是这段代码完全没有意义,编译器就是一个程序,所以我不希望从中得到毫无意义的东西。
编译器如何设法发出完全没有意义的代码?