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