掛羊頭賣狗肉蓄意欺騙讀者——譚浩強《C程序設計(第四版)》中所謂的“按照C99”(一)


掛羊頭賣狗肉蓄意欺騙讀者——譚浩強《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的基礎上增加或擴充一些功能而成的,因此C89C99基本上是兼容的。用C89編寫的程序在C99環境下仍然可以運行。——p12

“賊人不打,三天自招”,在這里這本書把自己的企圖說得明明白白,它想走的路子主要是用C89與C99完全一致的內容來冒充C99。但它卻完全沒想到,C99除了增加新內容外,還廢除了C89的某些條款或修改了某些條款。

C99所增加的有些新的功能和規則,是在編制比較復雜的程序時為方便使用和提高效率而用的,本書對目前暫時用不到的內容不作介紹——p12

前半句是在無知+臆想基礎上造的謠言,后半句羞羞答答地告訴你“按照C99標准”是在逗你玩。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM