掛羊頭賣狗肉蓄意欺騙讀者——譚浩強《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標准”是在逗你玩。
