main函数不写return 0,会怎么样?

您所在的位置:网站首页 linux怎么写代码 main函数不写return 0,会怎么样?

main函数不写return 0,会怎么样?

2023-06-05 17:21| 来源: 网络整理| 查看: 265

我对这个事情印象很深

是因为我在面试腾讯那时,其中笔试环节要求写代码,我在我的电脑前敲打着,电脑里面的另一边是腾讯的面试官,我正在着迷的思考我的代码时候,对面冒出来了一个声音,说,你的main函数没有写return 0。

这是一个非常不错的面试官,入职后我们还经常一起打球,我每次把球分给他后,我都鼓励他大胆投出去,并且,他的中投有一定的命中率。

就是因为那件事,我对return 0这个事情印象挺深。

刚好看到朋友发了一篇关于这方面的文章,也推荐给大家看看。

我知道肯定有人会问我腾讯笔试题目,题目我之前有写过,如果想知道的可以翻下21年7月份左右的文章。

21e29602fa2b15ee9b3c8f08afcf6cb5.png

经常在知乎上可以看到这个问题,于是尝试着回答了一下,没想到国内C++巨佬吴咏炜老师还给我点了个赞,让我相当激动,下面具体介绍下!

结论可能大家看上面的图就知道了,没有加return 0;编译器会自动添加一个。那怎么证明呢?

可以查看相应的汇编代码,查看汇编代码推荐使用godbolt.org网站,相当方便。

b94eabd878dfb13102676a26cbff59d5.png

如上图,输入C++代码,在右半部分会显示编译器编译后的汇编代码,通过查看高级语言背后的汇编指令我们可以更好的分析代码的性能。网站更强大的功能是它支持市面上几乎所有的编译器,而且各个版本都有。

下面使用这个网站分析一波!

先看一段带有return 0的截图:

bf185653b5a71947d03146cdd655eca9.png

看我右面红框圈出来的代码,大家可以理解为eax就是main()函数的返回值,这里可以看到main()函数的返回值是0。

再看一段不带return 0的相应截图:

3b6a6dada532477151df4fdecaa7d017.png

可以发现编译器还是把eax的值设为了0,由此可以理解为,即使在main函数中不写return 0,编译器还是会默认添加个return 0。

那其他非main函数也会默认添加个return 0吗?

先看一个普通的带有int返回值的函数:

275f848db2ff80fd683ec0b186338618.png

注意看func()中的eax寄存器被赋值为9,即func()的返回值为9。

如果不加return a是什么样子?

8fe63ad3ed9dd5bc89d54dc6a8fc5768.png

可以看到,如果在func()内不写return语句,编译器则没有给eax寄存器更新值,那函数的返回值就不会是我们期待的样子。

得出结论:

正常一个带有返回值的函数,返回值都会存在某个地方,可能是栈上也可能是寄存器里,如果你不给它返回值,那可能外部获取的返回值就是个奇奇怪怪的值,因为咱也不知道那块地址是什么数据。

但是吧,main函数除外,因为main函数没有return的话,编译器会默认加个return 0;但个人认为这也确实是不好的习惯,mian函数会犯这种错误,其它函数估计也会这样,所以最好所有的带有返回值的函数都添加return xxx。

打完收工。

c0a483e81de637eb6fa3b010759749e3.jpeg

3b45a48eb5c06caa58d46e0f28b4dd6a.jpeg



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3