这段文字中的“函数类型”这个概念也有错误,函数类型所描述的不但包括函数返回值类型 , 也可能一并描述参数的个数和类型(如果是函数原型),因此不能与“形参的类型、个数”相提并论 。
现代的C语言的函数定义和函数类型声明都采用函数原型式的风格,C99把旧的非原型形式视为过时 , 这意味着非原型形式以后可能被禁止 。
main()函数
在各种C语言书上,能看到各式各样main()函数的写法,简直令人无所适从,这是这么回事?原因主要有两个:一个是随着C语言的发展和演化,main()函数的写法也在不断变化;另外,某些书籍写法不规范或误导的现象也同时存在 。
最初main()函数的写法非常简洁,那个时候的C程序员哪怕一个字符似乎都不肯多写 。不知道是因为当时键盘质量不好还是因为编辑器太糟糕的缘故,那个时代的C程序员似乎惊人地一致崇尚“简约”——甚至可以说是“至简” 。
?
1234
main(){ printf("hello,world\n");}
这就是main()函数最古老的写法,KR在他们的经典名著《The C Programming Language》中的第一个C语言源程序(1978) 。这种写法是那个时代的主流 。
简直和裸体差不多,连#includestdio.h也没有么?在《The C Programming Language》的第一版中确实没有 。那个时代的C语言,返回值类型为int的函数不用声明 。不过在该书的第二版(1988)中这个程序被改成了:
?
12345
#include stdio.hmain(){ printf("hello,world\n");}
返回值类型为int的函数不用声明的规则改变了吗?规则没有改变 。改变了的是观念,人们已经不再倾向于代码的“至简”,而开始倾向于在代码中交代清楚每一个标识符的来龙去脉 。从C89开始倡导在函数调用之前一定要有函数声明,但并没有强求,而在C99这已经是强制性的要求了 。由于《The C Programming Language》第二版正值ANSI C标准颁布(1989)前夕出版,所以这种变化也应该视为ANSI C标准的倾向性以及KR对新标准的认同 。尽管这个例子没有完全反映出来这种认同 。
为什么说没有完全反映出来这种认同呢?因为这个main()的定义并没有按照函数原型(Function prototype)的方式来写,C90中规定不带参数的main()函数应该这样写:
?
1
int main(void) { /*. . .*/}
但同时规定那个int可以省略 。C90把()内不写任何内容视为过时的写法,尽管C90无奈地容忍了它(The use of function declarators with empty parentheses (not prototype-format parameter type declarators) is an obsolescent feature.) 。
为什么要容忍?因为有许多老式的代码还在用 。
如果以C99的标准看这个main()写得如何呢?C99不容许省略int 。但同样只把()内不写任何内容视为过时,而没有完全禁止,可见习惯力量的顽固 。
那又为什么说KR对新标准的认同呢?《The C Programming Language》第二版中的其他函数定义和函数类型声明基本上都改成了函数原型风格 。比如,在讲解main()函数的参数时,KR把原来的main()函数
?
1234567
#include stdio.hmain(argc,argv)int argc;char *argv[];{ /*…… */ return 0;}
改成了:
?
123456
#include stdio.hmain(int argc, char *argv[]){ /*…… */ return 0;}
前一个写法今天已经差不多绝迹,后一个main()以今天的眼光来看有些奇怪,main()的参数是用函数原型风格写的 , 但却没有写main()返回值的类型,给人有点半新半旧的感觉 。尽管不能说它违背C90(因为C90容许不写main()前面的int),但如果写上了返回值的类型int,就同时满足现代C99标准的要求了 。
这里出现的“return 0;”是怎么回事?这在现代C语言中已经是司空见惯了,它返回给操作系统一个值以表明程序是在何种状态下结束的 。但在另一段代码中,KR似乎又走得太远:
推荐阅读
- 年末清仓直播话术,直播间清仓产品怎么做
- redis事件使用,redis 事务 lua
- 黑发女生角色扮演游戏,黑衣白发的女游戏人物
- 国外的手机直播软件,国外手机直播平台都有什么
- vb.net用户权限 vbs权限
- 首次使用sqlserver,首次使用京剧一词的报纸是
- 光速虚拟机如何同步数据,光速虚拟机如何同步数据到手机
- 大庆服饰8点直播带货,大庆直播带货公司
- vb.net+浮点数转换 vb浮点除法怎么算