| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3800 人关注过本帖
标题:发两个程序,以视今天下午的学习成果,如果你也是初学者,一起加油!!!
只看楼主 加入收藏
马也
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2012-1-24
收藏
得分:0 
回复 32楼 zklhp
恩,我搜索出来了,正在看~
2012-08-09 12:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
网上关于int main()还是void main()的争论太多了,清一色都是指责void main()的,而这些人无一例外都是排斥微软的派系人士。虽然说微软存在很多问题,但并非一无是处,否则不能有如此地位,它能够胜利,必然是合理成份比别的东西多,得到认可,不是原教旨主义者说鄙视就能鄙视得了的。就具体事例而言,这个问题确实无伤大雅,使用void main(),犯不上被指斥为不守规范,说这话的人,无非是暗指不要听微软的而已。

授人以渔,不授人以鱼。
2012-08-09 12:47
Vitens
Rank: 2
等 级:论坛游民
帖 子:38
专家分:47
注 册:2012-7-27
收藏
得分:0 
回复 42楼 TonyDeng
原来是这样啊,今天又长见识了 我。
2012-08-09 13:08
马也
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2012-1-24
收藏
得分:0 
回复 42楼 TonyDeng
恩,您说的很对,不应拘泥于形式,两位的讨论让我对这个问题有了更深刻的认识。置于微软神马的,哈哈~目前和我关系不大~
我的理解是:
如果主函数涉及到返回值,就用int。如果没有返回值两种都可以,不过我觉得void从字面意识上更能体现返回值为空这个意思。

但是我刚才在修改程序的时候又遇到了一个问题,我把主函数改成int main,在末尾加上了return 0;程序编译成功,不过在输出结果的时候并没有什么不同,改成return 1;也是一样的,关于return还是理解不够,刚才那位版主说可以通过return检测编译是否成功,编译成功会有返回值(不知道我理解对不对。),但结果是没有丝毫的变化。有些困惑!
2012-08-09 13:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
关于函数的原型声明,现代编程都建议放在的外部的,因为事实上放在函数内部逻辑难以自圆其说。

按语法,在花括号内部的东西,是局域性的。你在main()函数内部声明某个函数fun(),那么这个声明应该意味着fun()只能在main()内部使用,在main()外部是不可见的。但是这产生了如下问题:同样的语法也应该在非main()函数中成立,那么对main()下层的fun1()和fun2(),在fun1()中声明了fun(),照理fun2()应该不知道存在fun(),但是C的语法规定fun()函数的实现代码必须在函数外,也就是说它在文件模块中可见,这样fun2()事实上也能看到fun(),并非你预料的fun2()不能看见,这是自欺欺人。事实上,由于main()是最顶层的函数,一般在main()声明居于调用链的最顶层,由于main()的全局覆盖性质,它事实上等效于全局声明,此时是发现不了问题的,但如上所述那样考虑,就会出问题。

在文件级别上声明的函数,是在模块(该.c或.cpp文件是一个模块)中可见的,别的模块看不到(要看到必须用extern修饰符指定外部实现),这样,仍属于局域性的声明,是C能够模仿C++进行内部封装的基本手段——通常一个模块文件就相当于C++中的一个类,传统C都是这样使用模块做大系统的。

[ 本帖最后由 TonyDeng 于 2012-8-9 13:38 编辑 ]

授人以渔,不授人以鱼。
2012-08-09 13:28
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
是不是所有的编译器都用 exit 来返回 main 的返回值我是不太清楚。但是标准规了,main 的 return (N) 语句的效果必须与 exit(N) 等价。所以我觉得简明的实现就是应该用 exit 来返回。

只是说不管声明成 int 还是 void,main 在逻辑上都应该有个返回值。所以声明成 int 更合理。
上次争论这个 void main 的问题就我和你。我也不是太反对这个 void main 的事。但是就我所知确实只有 MS 的编译器这么搞,很多其它的编译器写 void 是会给警告或者错误的。这可能是导致每次一提这个 void main 的时候总拿微软说事后原因。
微软很久以前不太喜欢遵循标准,其目的很有可能是为了垄断。但现在的微软变化还是很大的,对标准上的事,也做的比较努力了。在很多方面,我现在并不抵触微软。

我不抵触这个 void main 至少还有另一个原因。
在谈论 C 语言的时候,标准确实规定合法的 main 只有那两种形式。但是事实上在 C++ (2003年标准) 里并不是这么规定的,它只是说编译器必须支持这两种形式的 main 函数,而其它形式的 main 函数行为是未明确。

历史遗留和向后兼容问题,始终都是阻碍程序设计前进的难题。这不仅对微软,对所有的开发者都一样。
2012-08-09 13:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 44楼 马也
程序运行的结果是没有变化的,不同在于程序结束后向操作系统传递了什么信息。要想到不同的返回值,应该在.bat文件中获取errorlevel环境值,这个值就是你的程序的返回值。一般的用法,是在.bat文件中根据刚才运行的程序的结果决定后续程序如何运行,用于调度整个解决方案的。那是旧式操作系统调度程序的方式,在当今Windows下,程序已经不是那样运作的了,所有程序的一切动作都掌握在Windows手中,包括某个函数什么时候运行,都不是程序说了算,而是Windows说了算,所以这种调度方法已经过时,现在都是使用API直接与操作系统沟通调度进程或线程,无需再在程序结束之后再做什么,你可以随时随地启动和终结需要的模块。这就是现在无需再把main()的return 0看得那么重要的原因。

授人以渔,不授人以鱼。
2012-08-09 13:35
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:0 
小型程序这么写没事
大型程序这么写的话
代码维护很麻烦的
自己都看糊涂
2012-08-09 13:36
马也
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2012-1-24
收藏
得分:0 
以下是引用TonyDeng在2012-8-9 13:28:53的发言:

关于函数的原型声明,现代编程都建议放在的外部的,因为事实上放在函数内部逻辑难以自圆其说。

按语法,在花括号内部的东西,是局域性的。你在main()函数内部声明某个函数fun(),那么这个声明应该意味着fun()只能在main()内部使用,在main()外部是不可见的。但是这产生了如下问题:同样的语法也应该在非main()函数中成立,那么对main()下层的fun1()和fun2(),在fun1()中声明了fun(),照理fun2()应该不知道存在fun(),但是C的语法规定fun()函数的实现代码必须在函数外,也就是说它在文件模块中可见,这样fun2()事实上也能看到fun(),并非你预料的fun2()不能看见,这是自欺欺人。事实上,由于main()是最顶层的函数,一般在main()声明居于函数,由于main()的全局覆盖性质,它事实上等效于全局声明,此时是发现不了问题的,但如上所述那样考虑,就会出问题。

在文件级别上声明的函数,是在模块(该.c或.cpp文件是一个模块)中可见的,别的模块看不到(要看到必须用extern修饰符指定外部实现),这样,仍属于局域性的声明,是C能够模仿C++进行内部封装的基本手段——通常一个模块文件就相当于C++中的一个类,传统C都是这样使用模块做大系统的。


恩,您讲这个除了后面涉及C++的封装和类那句话,我都可以理解,这个我在学习过程中已经接触到了,但是在这次编程中没有注意到这一点。已经意识到了,以后注意~

[ 本帖最后由 马也 于 2012-8-9 13:40 编辑 ]
2012-08-09 13:38
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 47楼 TonyDeng
如果不靠返回值的话,在 windows 下,一般怎么指示一个进程的退出状态呢?
2012-08-09 13:44
快速回复:发两个程序,以视今天下午的学习成果,如果你也是初学者,一起加油!! ...
数据加载中...
 
   



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

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