标题:[原创]深入讲解main()返回值问题
取消只看楼主
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
 问题点数:0 回复次数:8 
[原创]深入讲解main()返回值问题
*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: 冰的热度
*/ 时间: 2007-9-29 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------



前些天在论坛看到一贴,讨论main()函数的返回值,

有的说必须有返回值,如:return 0;

有的说没有也可以,如:用void修饰main()

但大家的讨论都只留于表面,现在我来试着讲解一下深层含义!

以下观点纯属个人观点,若有不当之处,望高手们不吝赐教

要想真正理解这个问题,首先要了解一下操作系统的外壳

操作系统是由多个功能模块组成的庞大,复杂的软件系统,任何通用的操作系统,都要提供一个称为shell(外壳)的程序,用户(操作人员)使用这个程序来操作计算机系统进行工作.
DOS中有一个程序command.com,这个程序在DOS中称为命令解释器,也就是DOS系统的shell.


用户的命令由command执行,首先command把程序加入内存,然后设置CPU的CS:IP指向程序的第一条指令(也就是程序入口,在C++中就是main()函数),从而使程序得以运行.程序结束后,返回到command中,CPU继续运行command.注意在返回的时候要有一个返回值,这样才能安全退出程序(注意我用的是退出一词),之后各寄存器会有恢复动作,如果没有返回值,虽然表面上看程序也正常结束了,但实际上它并没有退出,各寄存器并没有恢复,如CS:IP 还是指向程序尾部,如果得到CS:IP,那么可以让程序继续执行下去,但是所执行的程序已经不是你的代码所在的那段内存空间了,它在执行其它内存中的程序.

我先写这些吧,怎么样,明白了吗?

****************************************************
//第一次补充:

在C++中,如果是void main()的话,理论上说,应该不会正常结束,当然,这完全是我的猜测,

因为在汇编程序中,有int 21h的话,结束后会提示 Program terminated normally,

意思是程序正常结束,然后在用T或P命令,将没有指令执行,

如果没有int 21h这一句,就不会有这个提示,也就是说程序没有正常结束,

此时用T或P命令,CS:IP将指向下一条指令,并执行.

类比一下,C++中也应该是这样,
用int main()
{
......
return 0;
}的话会正常结束,

用void main()的话,虽然也能结束,但似乎会有潜在的问题.

******************************************************

[此贴子已经被作者于2007-10-3 21:11:25编辑过]

搜索更多相关主题的帖子: main 返回值 讲解 
2007-09-29 17:58
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
得分:0 
有更新,请看原贴下的补充!

科学是永恒之迷...... 我的博客http://blog..cn/u/1267727974 阅读我的blog,懂与不懂都是收获!
2007-09-29 20:39
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
得分:0 
回复:(miyayaya)嗯嗯,学习了LZ跟野比两位辛苦了...
请问 LZ 是谁呀?

科学是永恒之迷...... 我的博客http://blog..cn/u/1267727974 阅读我的blog,懂与不懂都是收获!
2007-09-30 17:49
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
得分:0 
回复:(秀才)[quote]用户的命令由command执行,首先c...
大家鼓掌......

感谢你给我补充了点"营养元素"

学到东西喽,耶......

科学是永恒之迷...... 我的博客http://blog..cn/u/1267727974 阅读我的blog,懂与不懂都是收获!
2007-10-01 18:28
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
得分:0 
请读者注意我的用词,特别是红字,

如果读者想得到一个权威的完美的答案,肯定会令大家失望,我还没到那个境界,

另外,我是单纯从语言的角度分析的,没有结合操作系统来讲


科学是永恒之迷...... 我的博客http://blog..cn/u/1267727974 阅读我的blog,懂与不懂都是收获!
2007-10-03 21:19
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
得分:0 
回复:(编程高手)LZ分明是不懂装懂嘛,错漏百出,还...
1.有句话说的好呀,"不怕你想错,就怕不去想"

2.请告诉我,到底 LZ 是谁呀! 或是什么意思呀?

科学是永恒之迷...... 我的博客http://blog..cn/u/1267727974 阅读我的blog,懂与不懂都是收获!
2007-10-03 21:25
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
得分:0 
哦,对对对,有道理.谢了.

科学是永恒之迷...... 我的博客http://blog..cn/u/1267727974 阅读我的blog,懂与不懂都是收获!
2007-10-03 22:17
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
得分:0 
再次鼓掌......

谢谢又给我补充了些"营养元素"

ありがと



[此贴子已经被作者于2007-10-6 16:39:47编辑过]


科学是永恒之迷...... 我的博客http://blog..cn/u/1267727974 阅读我的blog,懂与不懂都是收获!
2007-10-06 16:25
冰的热度
Rank: 2
等 级:禁止访问
威 望:5
帖 子:404
专家分:0
注 册:2006-12-2
得分:0 
我又有了新的想法,但还没得到答案,所以还不想补充到原贴中,

新的想法如下:

现在可以基本肯定一点,main()函数最后结束之后,要返回操作系统,

那么CPU会对相关寄存器做些恢复操作,

但是到底做了哪些工作,目前我实在不知道,

我觉的要清楚的解释其来龙去脉可能要涉及到内核级的知识,

所以我希望内核级的超级大师点拨我一下.

不懂的就不要乱发贴 瞎 嚷 嚷 了!

[此贴子已经被作者于2007-10-8 21:36:29编辑过]


科学是永恒之迷...... 我的博客http://blog..cn/u/1267727974 阅读我的blog,懂与不懂都是收获!
2007-10-08 21:34



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-174080-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.325616 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved