挂羊头卖狗肉蓄意欺骗读者——谭浩强《C程序设计(第四版)》中所谓的“按照C99”(一)
《C程序设计(第四版)》(后面简称《谭C》)的版权页的内容简介中写到:
“本书按照C语言的最新标准C99进行介绍,所有程序都符合C99的规定,使编写程序更加规范”
封底霍然写着:
“按照C99标准进行介绍,以适应C语言的发展,使程序更加规范。”
很多初学者看到这些欢天喜地地以为自己也咸与维新了,因为学的也是最新的C99了(注:C语言最新标准其实是C11)。实际上这两句话深有玄机。
那两句话的真正含义究竟是什么呢?要想知道这个问题答案,需要首先了解标准的更迭意味着什么。
一个新标准取代旧标准,无外乎包括四种情况:1.增加了新内容;2.废止了旧内容;3.修改了旧内容;4.和旧标准保持一致。
和旧标准一致的情况显然很多,有很多东西自从C语言诞生以来压根就没变过,比如if语句的写法,定义变量的方法,……数不胜数的情况都属于在任何标准下都是完全一样的。因此哪怕最古老的代码中也有相当大的一部分有资格说符合最新C语言标准。
所以,即使是在C89标准年代写的书,只要内容中没涉及被C99废止了内容也没涉及被C99改变了的内容,那么你也不能说它违背了C99标准。但是能否说它是“按照”C99标准呢?这确实有点成问题,不过《谭C》并不属于这种情况。
《谭C》在一开始讲到修订原因时讲它所谓的“按照C99标准介绍”,是:
① 数据类型介绍中,增加了C99扩充的双长整型(long long int)、复数浮点型(float complex,double complex ,long long complex)、布尔型(bool)等,使读者有所了解。——p12
然而实际上C99不但增加了long long int类型,还增加了unsigned long long int类型;C99中根本就没有long long complex类型,也没有bool类型。
同页中:
② C99要求,main函数的类型一律指定为int型,并在函数的末尾加一个返回语句“return 0;”。——p12
然而实际上是C89要求main函数的返回值类型只能是int类型,C99放宽了这种要求,并没有要求main函数的类型一律指定为int型。C99只是要求int必须明确写出,而C89则没有要求必须明确写出int,但不写的含义等同于返回值为int类型。
C99程序中main函数体内可以不加return 0;,表示的含义依然是return 0;C89下的程序,main函数体内必须写return 0;,否则返回的是无意义的值。
《谭C》硬把main函数的返回值类型是int类型,main函数体内必须写return 0;这两个C89的规定说成是C99的新规定,是在刻意粉饰《C程序设计(第三版)》main()的荒腔走板:
void main(){}
《C程序设计(第三版)》对此振振有词地讲到:“main前面的void表示此函数是’空类型’,void是‘空’的意思,即执行此函数后不产生一个函数值”(p3)
void main()是哪个标准的规定呢?对不起,没有任何一个标准讲main()可以这样写。这种写法是错误的。为了掩饰这个错误,《谭C》编造了一个弥天大谎,硬把int main()和return 0;说成是C99的要求。
同页:
由于C99是在C89的基础上增加或扩充一些功能而成的,因此C89和C99基本上是兼容的。用C89编写的程序在C99环境下仍然可以运行。——p12
“贼人不打,三天自招”,在这里这本书把自己的企图说得明明白白,它想走的路子主要是用C89与C99完全一致的内容来冒充C99。但它却完全没想到,C99除了增加新内容外,还废除了C89的某些条款或修改了某些条款。
C99所增加的有些新的功能和规则,是在编制比较复杂的程序时为方便使用和提高效率而用的,本书对目前暂时用不到的内容不作介绍——p12
前半句是在无知+臆想基础上造的谣言,后半句羞羞答答地告诉你“按照C99标准”是在逗你玩。