c语言main的性质,关于main()

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

Dairy 2/21 Declaration of Main

开始学C了,在C吧看了看,发觉,还是有很多人喜欢用void main(),好吧,这与我无关。但是,还是喜欢能够帮到大家。当然,如果有人认为我说的不对,私底下骂就可以了。

话说我还是一个菜鸟的时候,第一个知道的C知识就是每个C程序都要有一个main(),可是,我发现,关于main()的使用,版本实在是太多了,比如:

• main()

• main(void)

• void main()

• void main(void)

• int main()

• int main(void)

• main(int argc, char* argv[])

• int main(int argc, char* argv[])

• int main(int argc, char** argv)

and so on

于是乎,我抑郁了。

在C++正式入门后,这个问题总算是解决了。

一个C/C++程序编译成exe后,由系统调用,一些系统会要求exe程序执行完后返回一个值,表明程序的执行状态。比如Unix,MS-Dos。

也就是说,main()必须有返回值!虽然某些时候,没有返回值也不会出错。(有时,这个返回值系统可能不需要,但它要不要是一回事,你给不给就是另外一回事了,性质不一样。要是敢不给。。。)

在C标准中,main()只有两种合法声明:

Int main(void)

Int main(int argc, char* argv[]) (char* argv[]有许多不同的写法)

那么,为什么有那么多的main()版本呢?

在C中,当没有指定返回值类型时,默认返回值为int,所以,main()和main(void)的写法很常见,它们与前者是一样的,都会返回int。(TCPL中用的就是main())。

那个括号里的void又是怎么回事呢?它说明这个函数没有参数。

在很早的C中,f(),并不意味着函数f没有函数,而是说,它可以接受任意参数,相当于f(…),在新的C中,为了和以前的C兼容,保留了这种用法。但这妨碍了函数的参数一致性检查。为了表示函数没有参数,引入了void符号,表示没有参数。(不过后来这被认为不是好的设计,它不但丑,而且逻辑上是多余的。所以C++中不用了)

综上,我推荐使用int main()。(这里就不使用int main(void)了)

(main()在C++中不能用,因为C++不支持默认返回类型为int,C为了C++兼容,这种用法也不用了)

记住,要在main()函数体末尾加上return 0;(返回0表示程序正常执行)。不过这有时是多余的,多数编译器会自动帮你加上。所以TCPL中,都没有return 0;但最好还是写上,这样代码意图更加明确。特别是有些编译器在你没写时会报错(“main没有返回值“)。。。有些自作聪明的人为了防止报错,就发明了这种写法:void main(),然后。。。就不会报错了,再然后,它流传开了,更糟的是,有些时候,编译出的程序还能够用。。。

那么,如此声明会带来什么严重的后果呢?它可能让程序无法执行!!!(调用者可能不会理这个程序)。(还有万分之一的例外(参见宿主实现和独立实现),不要去想它)

另外,为了能与C++兼容,我们也不应该使用void main(),这种用法在C++中是绝对错误的。

最后,解释一下这个问题,为什么那么多书都用了void main()。

应该说,他们是很不负责任的,他们没有按照C标准来写代码。使用void main()的写法,原因大概有:

• 编译器经常提示”main 没有返回值”,有的人嫌烦,用了void,而且在他的机子上正好可以运行,于是乎。。。

• 看别人这么用,自已也就这么用了。(他们可能都没有在编译器上亲手实验过自己写的书中的代码,或者只在一个环境下试过,这是很不负责任的。好的书上的代码会在至少两种编译器上进行测试)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值