| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3802 人关注过本帖
标题:发两个程序,以视今天下午的学习成果,如果你也是初学者,一起加油!!!
取消只看楼主 加入收藏
马也
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2012-1-24
收藏
得分:0 
以下是引用pangding在2012-8-8 21:45:27的发言:

现在能见到的书可能也只有老谭是讲 void main() 的。

规定要写 int main(),很多现代编译器也已经不支持 void main() 的这种写法了。main 函数是程序的入口,它的名字和形式都是规定的,不允许程序员更改。
从没见过有人质疑 main 的名字,但很多人忽视返回值。一个原因可能是很久很久以前,对这个并没有明文规定。

现在的规定是,main 只有两种合法形式:
int main() {}和
int main(int argc, char *argv[]) {}至于第二种形式,规定又说,第二参数可以使用等效的 char **argv。

老一点的书也可能讲,main 还可以有第三个参数。总之,混乱还是存在的。但主要都是一些历史因素。
做这种规定,自然也有有它的原因。除了技术上原因以外,也有历史上的原因。其实我一直以为,现在已经比较明确了。但是也有人至今在为此争议。

对于初学者,不用太多了解这些细节,只要记得,一写 main 函数就是 int main(),return 0,就行了。
对于一些实现,void main 等价于编译器自动帮你改成 int,并 return 0。

对了,关于这个问题,我还有个事情要问您,如果按您所说,我的调用函数的类型是否也应该把void改成int;(比如我帖子中的这两个调用函数)。或者我可不可以进一步理解为在以后编写函数即使没有返回值的时候不再用void,全用int代替,然后没有返回值就在函数末尾写上return 0;???
2012-08-09 11:28
马也
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2012-1-24
收藏
得分:0 
回复 29楼 TonyDeng
我不是业内人士,这位版主说的这个没听说过,百度了一下和微软有关,肯定是权威的。我觉得不存在听或不听谁的意见,明白其中道理更重要,如果只是死记住一个用法,并不明白为什么,可能是无意义的。像这个void和int这个简单的问题,既然两种形式都存在,并没有语法错误,说明都有其合理性存在,只是在不同情况下的具体用法不同。所以我认为专家说的东西肯定有其道理,但不应该只是盲目的听取,探讨其中所蕴含的道理更重要。谢谢您提供的信息!
2012-08-09 12:33
马也
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2012-1-24
收藏
得分:0 
额。。。两位版主说的过于专业了,不在我理解范围内,不过你们可以继续讨论这个问题,忽略我~
2012-08-09 12:36
马也
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2012-1-24
收藏
得分:0 
回复 37楼 TonyDeng
恩,我明白您的意思,这个我想大家没有争议,void main当然是的,我理解的道理很简单,因为我的程序可以执行呀~哈哈~我也是在和那位版主请教int main的的用法,可没有盲目听取哦~没看我一直在问么~
2012-08-09 12:39
马也
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2012-1-24
收藏
得分:0 
回复 32楼 zklhp
恩,我搜索出来了,正在看~
2012-08-09 12:47
马也
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
马也
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
马也
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2012-1-24
收藏
得分:0 
以下是引用TonyDeng在2012-8-9 13:35:53的发言:

程序运行的结果是没有变化的,不同在于程序结束后向操作系统传递了什么信息。要想到不同的返回值,应该在.bat文件中获取errorlevel环境值,这个值就是你的程序的返回值。一般的用法,是在.bat文件中根据刚才运行的程序的结果决定后续程序如何运行,用于调度整个解决方案的。那是旧式操作系统调度程序的方式,在当今Windows下,程序已经不是那样运作的了,所有程序的一切动作都掌握在Windows手中,包括某个函数什么时候运行,都不是程序说了算,而是Windows说了算,所以这种调度方法已经过时,现在都是使用API直接与操作系统沟通调度进程或线程,无需再在程序结束之后再做什么,你可以随时随地启动和终结需要的模块。这就是现在无需再把main()的return 0看得那么重要的原因。


额。。。。就是说我在输出结果中是看不到返回值得,要在其他文件中查看。其他的不懂~有机会我会仔细研究~谢谢~
2012-08-09 13:44
马也
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2012-1-24
收藏
得分:0 
以下是引用Alar30在2012-8-9 13:36:04的发言:

小型程序这么写没事
大型程序这么写的话
代码维护很麻烦的
自己都看糊涂


木有写过程序,木有做过代码维护,望理解初学者的能力范围~我会慢慢学习~
2012-08-09 13:48
马也
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2012-1-24
收藏
得分:0 
我了个去~你们还在挣,我在看二维数组的指针问题,发现了一些问题,晚上来向你们请教!
2012-08-09 15:38
快速回复:发两个程序,以视今天下午的学习成果,如果你也是初学者,一起加油!! ...
数据加载中...
 
   



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

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