user-0 提问: 有返回值的main函数

回复:
user: user-1
content: 引用 25 楼 layershow 的回复:if (no break && no exit && no goto && ...) {     while = 死循环; }  if (while == 死循环) {     执行不到 return; }   ，那是误会了。只是C语言中，exit刚好是一个标准的系统函数，我看到它（而且还是全小写），我自然就联想到一个函数了，不过你21楼明确用了“调用”两个字，希望我没有再次误解你！

user: user-2
content: if (no break && no exit && no goto && ...) {     while = 死循环; }  if (while == 死循环) {     执行不到 return; }

user: user-3
content: 引用 19 楼 binaryhead 的回复:[quote=引用 18 楼 ForestDB 的回复:] 如果while中没有break，没有exit，没有其它导致流程跳转的东西存在，那么while就是死循环，这样的话return就执行不到。 exit是一个普通的函数，不是C语言的一个关键字。exit直接退出，绕过了从调用exit函数点之后直到main出口的正常执行顺序。结论：“没有exit，”应删除。[/quote] 我懂你在说什么，你懂我在说什么呢？

user: user-1
content: 引用 22 楼 bbs2241 的回复:[quote=引用 21 楼 binaryhead 的回复:] [quote=引用 20 楼 bbs2241 的回复:] [quote=引用 19 楼 binaryhead 的回复:] [quote=引用 18 楼 ForestDB 的回复:] 如果while中没有break，没有exit，没有其它导致流程跳转的东西存在，那么while就是死循环，这样的话return就执行不到。 exit是一个普通的函数，不是C语言的一个关键字。exit直接退出，绕过了从调用exit函数点之后直到main出口的正常执行顺序。结论：“没有exit，”应删除。[/quote]  return后也是调用exit。[/quote] 不要这么肯定好不好？首先，即使return后调用exit也并不支持你前面的while 中调用exit后会执行return的叙述。其次，return之后是否调用exit绝对是一个特定C编译器的具体实现问题，甚至与使用编译器的选项相关（参见我的博文：http://blog.csdn.net/binaryhead/article/details/18088785），请不要把它作为一个确定的规律好不好？在我的那个博文中你能确定main最后的return之后会调用exit？[/quote]  你想说明什么问题吗？ 还有你前面的回答又想说明什么问题呢?[/quote] 瞧你这质问的口气，很冲啊。 我想说明： 1、19楼纠正你18楼叙述中我认为不妥当的地方。 你20楼试图补充你18楼中我认为不妥的地方，或者可能是想纠正我19楼的叙述。 2、我21楼纠正你20楼的补充叙述。 除此之外，我不想说明任何问题。

user: user-4
content: 引用 21 楼 binaryhead 的回复:[quote=引用 20 楼 bbs2241 的回复:] [quote=引用 19 楼 binaryhead 的回复:] [quote=引用 18 楼 ForestDB 的回复:] 如果while中没有break，没有exit，没有其它导致流程跳转的东西存在，那么while就是死循环，这样的话return就执行不到。 exit是一个普通的函数，不是C语言的一个关键字。exit直接退出，绕过了从调用exit函数点之后直到main出口的正常执行顺序。结论：“没有exit，”应删除。[/quote]  return后也是调用exit。[/quote] 不要这么肯定好不好？首先，即使return后调用exit也并不支持你前面的while 中调用exit后会执行return的叙述。其次，return之后是否调用exit绝对是一个特定C编译器的具体实现问题，甚至与使用编译器的选项相关（参见我的博文：http://blog.csdn.net/binaryhead/article/details/18088785），请不要把它作为一个确定的规律好不好？在我的那个博文中你能确定main最后的return之后会调用exit？[/quote]  你想说明什么问题吗？ 还有你前面的回答又想说明什么问题呢?

user: user-1
content: 引用 20 楼 bbs2241 的回复:[quote=引用 19 楼 binaryhead 的回复:] [quote=引用 18 楼 ForestDB 的回复:] 如果while中没有break，没有exit，没有其它导致流程跳转的东西存在，那么while就是死循环，这样的话return就执行不到。 exit是一个普通的函数，不是C语言的一个关键字。exit直接退出，绕过了从调用exit函数点之后直到main出口的正常执行顺序。结论：“没有exit，”应删除。[/quote]  return后也是调用exit。[/quote] 不要这么肯定好不好？首先，即使return后调用exit也并不支持你前面的while 中调用exit后会执行return的叙述。其次，return之后是否调用exit绝对是一个特定C编译器的具体实现问题，甚至与使用编译器的选项相关（参见我的博文：http://blog.csdn.net/binaryhead/article/details/18088785），请不要把它作为一个确定的规律好不好？在我的那个博文中你能确定main最后的return之后会调用exit？

user: user-4
content: 引用 23 楼 binaryhead 的回复:[quote=引用 22 楼 bbs2241 的回复:] [quote=引用 21 楼 binaryhead 的回复:] [quote=引用 20 楼 bbs2241 的回复:] [quote=引用 19 楼 binaryhead 的回复:] [quote=引用 18 楼 ForestDB 的回复:] 如果while中没有break，没有exit，没有其它导致流程跳转的东西存在，那么while就是死循环，这样的话return就执行不到。 exit是一个普通的函数，不是C语言的一个关键字。exit直接退出，绕过了从调用exit函数点之后直到main出口的正常执行顺序。结论：“没有exit，”应删除。[/quote]  return后也是调用exit。[/quote] 不要这么肯定好不好？首先，即使return后调用exit也并不支持你前面的while 中调用exit后会执行return的叙述。其次，return之后是否调用exit绝对是一个特定C编译器的具体实现问题，甚至与使用编译器的选项相关（参见我的博文：http://blog.csdn.net/binaryhead/article/details/18088785），请不要把它作为一个确定的规律好不好？在我的那个博文中你能确定main最后的return之后会调用exit？[/quote]  你想说明什么问题吗？ 还有你前面的回答又想说明什么问题呢?[/quote] 瞧你这质问的口气，很冲啊。 我想说明： 1、19楼纠正你18楼叙述中我认为不妥当的地方。 你20楼试图补充你18楼中我认为不妥的地方，或者可能是想纠正我19楼的叙述。 2、我21楼纠正你20楼的补充叙述。 除此之外，我不想说明任何问题。[/quote]  额额，也不知谁如此激动。  你看出我19楼认为你评论不当？再仔细品味一下，如果还这么认为，那是我语文没学好，是我描述不当。  ps：我也不知道你给了个博客想说明什么，你想说我说的不正确，你完全可以找出反例，对不对？ansi c或者iso c？不要动不动就说别人说话冲，我完全是以询问的口气说话在问。

user: user-1
content: 引用 9 楼 mymtom 的回复:[quote=引用 8 楼 nice_cxf 的回复:] 7楼乱误导，现在基本都不会有人写void main()，都是int main()，实际就算是int main()，也可以不用写return，但是这样写程序不是好习惯   是的呀，C89 里就说好了main的返回值是int的，国内某些教材祸害了几代C程序员啊  2.1.2.2 Hosted environment     A hosted environment need not be provided, but shall conform to the following specifications if present.  "Program startup"     The function called at program startup is named main .  The implementation declares no prototype for this function.  It can be defined with no parameters:           int main(void) { /*...*/ }  or with two parameters (referred to here as argc and argv , though any names may be used, as they are local to the function in which they are declared):           int main(int argc, char *argv[]) { /*...*/ }  [/quote] 版主大人“祸害几代人”的说法严重了，前面10楼的网友的看法我认为也有些偏颇。         1、从一个通用的C编译器来说，对一个特定函数名称函数的原型加以限制，实现并不难（虽然这种限制是遵照规范要求而不是编译器厂商的扩展），当然像main这种程序的启动点函数加以特殊照顾也不会过。版主如果有C89的原文链接给出的话，本人十分感谢，我很想知道C89 规范2.1.2.2的前后相关内容。个人的感觉是，C89制定的背景主要是针对Unix系统的。Unix上一个程序运行之后有一个返回值，其它程序可以检测此返回值作进一步处理，这符合操作系统（包括Windows）下应用开发的惯例，所以C89用了“shall conform”的强烈建议的词汇，不过还没有用must！实际上，恰恰是一些嵌入式C编译器，考虑到用户的系统可能并没有操作系统存在，就一个单一任务，main的返回值并不重要，所以允许void main形式的声明，比如本人经常用到的Keil C 51。         2、对10楼网友，void函数并不只是让程序员感受好一点，如果声明了void型函数，编译器是否真的要准备返回值（比如x86下放在EAX寄存器中），恐怕只有试验过每一个编译器才好这么说。尽管不声明返回类型的函数，一些C语言编译器可能并不提示，强制当成返回整型值处理（好像是C标准，具体忘了在哪里了）。但不能由此推论void返回函数编译器就一定准备返回值，我估计C标准也不会建议编译器这么实现的。

user: user-2
content: 不只是 main 函数，所有函数的 void 返回只是用来让程序员好受一点，表示不关心这个返回值，帮我忽略了它 函数的那个返回值是一直存在的

user: user-5
content: 引用 8 楼 nice_cxf 的回复:7楼乱误导，现在基本都不会有人写void main()，都是int main()，实际就算是int main()，也可以不用写return，但是这样写程序不是好习惯   是的呀，C89 里就说好了main的返回值是int的，国内某些教材祸害了几代C程序员啊  2.1.2.2 Hosted environment     A hosted environment need not be provided, but shall conform to the following specifications if present.  "Program startup"     The function called at program startup is named main .  The implementation declares no prototype for this function.  It can be defined with no parameters:           int main(void) { /*...*/ }  or with two parameters (referred to here as argc and argv , though any names may be used, as they are local to the function in which they are declared):           int main(int argc, char *argv[]) { /*...*/ }

user: user-6
content: 7楼乱误导，现在基本都不会有人写void main()，都是int main()，实际就算是int main()，也可以不用写return，但是这样写程序不是好习惯

user: user-1
content: 引用 楼主 u014544409 的回复: 如上面的函数所示，主函数有返回值，但是当程序进入while(1)这个循环函数之后，一直在里面执行里面的内容，至于while(1)结束之后的return 0这个语句，如果while(1)这个循环不结束，应该不会执行这个语句吧，请大家帮忙分析一下，谢谢了。         “如果while(1)这个循环不结束”，当然不会执行return 0这个语句。如果你觉得return 0这条语句多余，只需修改main函数的声明：void main()就是了。         顺便纠正4楼的提法：没有编译器会强制要求有return，如果强制要求有return，不是编译器的问题，是你的函数声明的问题。比如：int main()，你明明告诉编译器这个函数有一个整型返回值，当然最后得有一条return语句了，尽管实际上这条return语句可能永远都不会执行到。不过就我碰到的，特定平台上部分编译器会对特殊函数main的原型声明有要求：比如必须要返回整型值。

user: user-7
content: 不执行return 0也可以返回的。  exit(0);

user: user-8
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-9
content: 不会执行到，一些嵌入式编译器规定必须有return，否则会产生警告，其实你可以换一种写法：  int main(void) {     int loop = 1;     ...     while(loop)     {         ...     }      return 0; }   这样有机会通过修改loop退出主循环，不过对于嵌入式系统来讲没什么意义。  引用 楼主 u014544409 的回复: 如上面的函数所示，主函数有返回值，但是当程序进入while(1)这个循环函数之后，一直在里面执行里面的内容，至于while(1)结束之后的return 0这个语句，如果while(1)这个循环不结束，应该不会执行这个语句吧，请大家帮忙分析一下，谢谢了。

user: user-10
content: 不会执行哟，亲

user: user-11
content: 只有while循环break后才会执行下边的语句，如果循环中有能满足条件的return或exit等结束程序语句，程序会直接退出

user: user-2
content: 不会执行，main 返回程序就结束了

user: user-4
content: 引用 19 楼 binaryhead 的回复:[quote=引用 18 楼 ForestDB 的回复:] 如果while中没有break，没有exit，没有其它导致流程跳转的东西存在，那么while就是死循环，这样的话return就执行不到。 exit是一个普通的函数，不是C语言的一个关键字。exit直接退出，绕过了从调用exit函数点之后直到main出口的正常执行顺序。结论：“没有exit，”应删除。[/quote]  return后也是调用exit。

user: user-1
content: 引用 18 楼 ForestDB 的回复:如果while中没有break，没有exit，没有其它导致流程跳转的东西存在，那么while就是死循环，这样的话return就执行不到。 exit是一个普通的函数，不是C语言的一个关键字。exit直接退出，绕过了从调用exit函数点之后直到main出口的正常执行顺序。结论：“没有exit，”应删除。