《C專家程式設計》一1 4 K R C

2021-09-23 16:02:24 字數 1691 閱讀 1553

到了20世紀70年代中期,c語言已經很接近目前這種我們所知道和喜愛的形式了。更多的改進仍然存在,但大部分都只是一些細節的變化(比如允許函式返回結構值)和一些對基本型別進行擴充套件以適應新的硬體變化的改進。(比如增加關鍵字unsigned和long)。2023年,steve johnson編寫了pcc這個可移植的c編譯器。它的源**對貝爾實驗室之外開放,並被廣泛移植,形成了整整一代c編譯器的基礎。c語言的演化之路如圖1-2所示。

圖1-2 後期的c

乙個非比尋常的bug

c語言從algol-68中繼承了乙個特性,就是復合賦值符。它允許對乙個重複出現的運算元只寫一次而不是兩次,給**生成器乙個提示,即運算元定址也可以類似地緊湊。這方面的乙個例子是用b+=3作為b=b+3的縮寫。復合賦值符最初的寫法是先寫賦值符,再寫操作符,就像:b=+3。在b語言的詞法分析器裡有乙個技巧,使實現=op這種形式要比實現目前所使用的op=形式更簡單一些。但這種形式會引起混淆,它很容易把

b=-3;  /* 從b中減去3 */

b= -3;  /* 把-3賦給b */
搞混淆。

因此,這個特性被修改為目前所使用的這種形式。作為修改的一部分,**格式器程式indent也作了相應修改,用於確定復合賦值符的過時形式,並交換兩者的位置,把它轉換為對應的標準形式。這是個非常糟糕的決定,任何格式器都不應該修改程式中除空白之外的任何東西。令人不快的是,這種做法會引入乙個bug,就是幾乎任何東西(只要不是變數),如果它出現在賦值符後面,就會與賦值符交換位置。

如果你運氣好,這個bug可能會引起語法錯誤,如:

epsilon=.0001;
會被交換成:

epsilon.=0001;
這條語句將無法通過編譯器,你馬上就能發現錯誤。但一條源語句也可能是這樣的:

valve=!open;   /*valve被設定為open的邏輯反*/
會悄無聲息地交換成:

valve!=open;  /*valve與open進行不相等比較*/
這條語句同樣能夠通過編譯,但它的作用與源語句明顯不同,它並不改變valve的值。

在後面這種情況下,這個bug會潛伏下來,並不會被馬上檢測到。在賦值後面加個空格是很自然的事,所以隨著復合賦值符的過時形式越來越罕見,人們也逐漸忘記了indent程式曾經被用於「改進」這種過時的形式。這個由indent程式引起的 bug直到20世紀80年代中期才在各種c編譯器中銷聲匿跡。這是乙個應被堅決摒棄的東西!

2023年,c語言經典名著the c programming language出版了。這本書受到了廣泛的讚譽,其作者brian kernighan和dennis ritchie也因此名聲大噪,所以這個版本的c語言就被稱為「k&r c」。出版商最初估計這本書將售出1000冊左右。截止到2023年,這本書大約售出了150萬冊(參見圖1-3)。c語言成為最近20年最成功的程式語言之一,可能就是最成功的。但隨著c語言的廣泛流行,許多人試圖從c語言中產生其他變種。

圖1-3 像貓王艾爾維斯一樣,c語言無處不在

C專家程式設計(一)

第一章 c 創越時空的迷霧 1 根據編譯器設計思路發展的語言特性 1 陣列下標從0開始,基於偏移量。2 表示式中陣列名可看作是指標,作為函式引數,陣列隱式轉換為指標,不需要複製陣列內容。2 c預編譯 1 字串替換 foo bar 2 標頭檔案包含 h 3 通用 模板擴充套件 巨集的實際引數只是原樣輸...

C專家程式設計

說到c語言,首稱 c程式語言 這是一本入門和進修均可的書籍,值得讀三遍以上,方才有味。進修書籍如 c專家程式設計 是一本c語言較高層次的書,是成為c語言專家的必經之路。我自以為達到了一定的 程度,才開始學習這本書的。人言,c語言是一門藝術,需要多年歷練才能達到較為完善的境界,此言不虛。c語言進修書籍...

C 專家程式設計

2011.9.4 c 專家程式設計 1 容易混淆的 const 關鍵字const 並不能把乙個變數變為常量,它修飾的符號僅表示該符號的值不能被賦值,也就意味著唯讀不可寫,但它並不能防止通過程式內部 甚至外部,其它函式 的方法來修改它。const 最有用支出是用來限定函式的形參,這樣該函式不會修改實參...