在C ++中转到陷阱

电脑杂谈  发布时间:2020-05-26 07:07:39  来源:网络整理

c++程序设计陷阱_c++程序设计原理与实践 c++程序设计语言_c c程序设计软件

尽管在编程中不建议使用goto语句,但有时不可避免地要使用goto来简化代码. 我将在下面讨论的陷阱在C语言程序中不会遇到,但是在C ++中有些粗心会导致问题.

直接查看以下代码:

c++程序设计陷阱_c c程序设计软件_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 !!

c c程序设计软件_c++程序设计原理与实践 c++程序设计语言_c++程序设计陷阱

让我们看一下这段代码,而不优化编译器:

	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 

c c程序设计软件_c++程序设计原理与实践 c++程序设计语言_c++程序设计陷阱

显然,原因是goto跳过了为t2赋值的代码. 在对t2进行增量运算之前,t2实际上是一个随机数(vs2013默认为1).

在C ++中c++程序设计陷阱,您可以在一段代码中的任何位置声明变量,以方便编程,并且还可能导致问题. 即使函数中的变量声明位置可以位于任何位置,在执行函数之前,所有变量的空间分配仍会完成,但是直到执行特定代码,变量内容的操作才会完成. 由于上面的goto语句引起的问题,尽管变量t2的空间已经存在,但未正确为变量分配初始值.

c++程序设计原理与实践 c++程序设计语言_c++程序设计陷阱_c c程序设计软件

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

技术分享

. )

最后要注意的是,如果已编译该程序的调试版本,则可以快速检查此类问题. 根据我的测试,在调试版本中,vc编译器将生成相应的代码以检测未初始化的变量. 一旦对类似t2的变量执行了操作,程序将报告错误.

在C ++中转到陷阱


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-222564-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...