当前位置: 首页 > 科技观察

如果正常的Intmain(){}不写Return0;会怎样?

时间:2023-03-14 20:38:18 科技观察

本文转载自微信公众号《程序喵大师》,作者程序喵大师。转载本文请联系程序大师喵公众号。知乎上经常看到这个问题,所以试着回答一下。没想到国内的C++大牛吴永伟先生给我点了个赞,让我兴奋不已。下面就来详细介绍一下吧!结论可以看上面。从图中可以看出,没有添加return0;编译器会自动加一个。如何证明?可以查看对应的汇编代码,推荐使用godbolt.org网站查看汇编代码,还是比较方便的。如上图所示,输入C++代码,编译器编译后的汇编代码会显示在右半部分。通过查看高级语言背后的汇编指令,我们可以更好地分析代码的性能。该网站更强大的功能是支持市面上几乎所有的编译器,并且有各种版本。下面就用这个网站分析一波吧!先看一张return0的截图:看右边红框圈出的代码,可以理解eax是main()函数的返回值,这里可以看到main()函数的返回值是0。看对应的没有return0的截图:可以发现,编译器还是把eax的值设置为0,所以可以理解,即使main函数里没有写return0,编译器还是会默认添加一个返回0。其他非main函数也会默认加一个return0吗?先看一个返回值为int的普通函数:注意func()中的eax寄存器赋值为9,即func()的返回值为9。不加returna会是什么样子?可以看到,如果在func()中不写return语句,编译器就不会更新eax寄存器,函数的返回值也不是我们所期望的。结论:正常情况下一个有返回值的函数,返回值会存放在某个地方,可能在栈上,也可能在寄存器中,如果你不给它返回值,那么从外部获取的返回值可能是奇怪的怪异值,因为我们不知道该地址是什么数据。但是,main函数除外,因为如果main函数没有return,编译器会默认加上return0;但我个人认为这确实是一个坏习惯,mian函数会犯这个错误,其他函数也很可能会犯同样的错误。所以最好所有有返回值的函数都加上returnxxx。今天就这样吧。