天天看點

《C缺陷與陷阱》讀後感-0

    為找工作,前段時間把C語言仔細溫習了遍,還草草地看了遍《程式員面試寶典》,加之畢業設計中寫了些自以為值得稱贊的程式,以為自己對C語言已經有了良好的把握。不過,在剛剛看了兩章《C缺陷與陷阱》後,才發現自己的認識是多麼的膚淺,才發現C語言的高深莫測,也更加加深了這樣的理念:任何事情都有不斷深入的必要和要求。同時,為了加深認識,也為練習文字能力,現将主要認識總結如下。

    1.C語言是人與計算機交流的語言,中間有個編譯器做翻譯的工作。是語言就有文法,那麼,為了達到可靠、有效的交流,就必須深刻了解該語言的文法規則,否則,難免出錯。C語言的文法有什麼規範、要注意些什麼呢?就我目前的認識水準可以總結如下:

    C語言規則不難掌握,難就難在避免自己的程式被編譯器給翻譯成其他程式!其實,本質還是文法規則把握的不夠深刻。就像你會英語,但是不能確定交流中不産生歧義一樣,說來說去還是基本功不紮實。那麼,有哪些需要多加注意的呢?就我目前的認識水準,可以總結如下:為防止編譯器的誤解,寫程式時要關注的符合有:() ++ -- ;還有符合的優先級和結合方向。

    2.歸納、遞推、抽象能力在C語言中的運用。任何工具,如果想運用自如,達到一個高的水準,必然要求對該工具的認識是高層次的,是深刻的,也就是抽象的,可以達到哲學的程度。現将書中例子列出一二如下:

  1. (*(void(*)())0)();

       懂嗎?第一次看見時,我也不懂。

     分析步驟我就不寫了,原則是運用上述歸納、遞推、抽象能力。具體含義是:這是個語句,進行函數調用,函數位址為0,函數類型為void()。其中:

  1. (void(*)())0

    是對0位址進行強制類型轉換,轉換為函數指針,指向的函數無傳回值無參數。

  1. typedef void(*Function-pointer)();

     懂嗎?

    分析步驟我也不再寫了,原則還是運用上述歸納、遞推、抽象能力。具體含義是:用typedef定義了一個新的資料類型(這個表示可能不準确)Function-pointer,它是一個指針,一個函數指針,指向的函數無傳回值無參數。

    上述2條語句結合起來可如下運用來簡化程式編寫:   

  1.     typedef void(*Function-pointer)();
  2.     (*(Function-pointer)0)();等同于(*(void(*)())0)();

        比這更複雜的還有很多,有興趣的可以了解下。

       好了,就這吧。總結起來有兩點認識:加強認識;抽象。