尽管程序设计中不提倡使用goto语句,但是有的时候为了简化代码,难免会使用到goto。下面我要讨论的这个陷阱C语言程序中不会遇到,反而C++中稍不注意就会引起问题。
直接看以下代码:
int _tmain(int argc, _TCHAR* argv[])
{
int t1 = 1;
if (t1 >0)
{
goto __next;
}
int t2 = 5;
__next:
t2++;
return 0;
}
这段代码在vs2008,以及vs2013上都能顺利编过,甚至不会有任何警告。但如果你编译的是release版本程序,很遗憾,程序虽然能运行,但是t2中得到的值并不是我们想看到的6!
下面,看看这段代码不带优化编译的汇编程序:
int t1 = 1;
00961016 mov dword ptr [t1],1
if (t1 >0)
0096101D cmp dword ptr [t1],0
00961021 jle wmain+17h (961027h)
00961023 jmp __next (96102Eh)
{
goto __next;
00961025 jmp __next (96102Eh)
}
int t2 = 5;
00961027 mov dword ptr [t2],5
__next:
t2++;
0096102E mov eax,dword ptr [t2]
00961031 add eax,1
00