
尽管在编程中不建议使用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上进行平滑编辑,而无需发出警告. 但是,不幸的是,如果编译该程序的发行版,尽管该程序可以运行,但是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
00961034 mov dword ptr [t2],eax

显然,原因是goto跳过了为t2赋值的代码. 在对t2进行增量运算之前,t2实际上是一个随机数(vs2013默认为1).
在C ++中c++程序设计陷阱,您可以在一段代码中的任何位置声明变量,以方便编程,并且还可能导致问题. 即使函数中的变量声明位置可以位于任何位置,在执行函数之前,所有变量的空间分配仍会完成,但是直到执行特定代码,变量内容的操作才会完成. 由于上面的goto语句引起的问题,尽管变量t2的空间已经存在,但未正确为变量分配初始值.

当然,如果将t2的类型更改为一个类,情况就不会那么糟糕,因为它会在编译时直接报告错误. 原因与上面类似: 尽管可以在执行函数之前分配类空间,但是goto的存在使类构造函数无法执行. 编译器检测到使用了不执行构造函数的对象,它将直接报告错误. 编译将失败. (一些不了解事实的孩子说c++程序设计陷阱,由于goto是C语言,所以报告了错误. 如果使用goto,则必须将变量放在函数的开头,这显然是您的一厢情愿.

. )
最后要注意的是,如果已编译该程序的调试版本,则可以快速检查此类问题. 根据我的测试,在调试版本中,vc编译器将生成相应的代码以检测未初始化的变量. 一旦对类似t2的变量执行了操作,程序将报告错误.
在C ++中转到陷阱
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-222564-1.html
对于强盗
烊烊我们电影院约啦