2016年5月20日 星期五

[books] linux c 編程 一站式學習

linux c 編程 一站式學習 60 rmb, 20111212 購於台南若水堂, 60X6 = 360 nt。

市面上有好多好多的 C 語言書籍 (當然還有 c++, 而且很多內容都很類似), 我已經有了 The C Programming Language, 還需要其他的嗎? (還真的需要)

實際上我的 C 語言書籍不多, 大部份是 C++ 相關書籍。我大多是從 c++ 書籍上順便學習 c。這本書能吸引我的目光是因為作者提到了匯編 (組合語言) 與 C 關係, 詳細解釋了 crt.o 和組合語言之間的關係, 還有 linker 的東西, 這對我來說可是如獲至寶, 只因為三個章節的內容 (17, 18, 19), 我就買了, 書中應該超過一半是我已經知道的東西吧! 不過令一半的東西很重要, 我訝異我自己竟然不知道。這三章的內容是作者參考 programming from the ground up 來的。和程式設計師的自我修養內容很像, 當然程式設計師的自我修養比較詳細。

買回家細看之後, 比我想的更值回票價, 書中提到的 c99, 讓我對有些 c99 語法有了概念, 原來某些我不太理解的語法是 C99 的用法。

第 14 章在說明 c 語言複雜的轉換規則, 有 Usual Arithmetic Conversion, Integer Promotion, 再去看 c 規格書應該會容易些。你知道 0 - 1 的 0 和 1 是 int 還是 unsinged int type 嗎? c 語言規定了繁複的轉換規則, 0 和 1 會被轉成 int 再做減法, 所以結果是 -1 而不是 4294967295, 14.3 是這章的精華, 得花點腦筋才能吸收, 坦白說, 這對初學者實在太深, 有個印象就好, 知道有這回事, 儘量不要處碰到這些悔澀的的地帶。

我也寫了篇相關心得文: C 語言的 usual arithmetic conversion

p174 有個表在說明 IPL32, PL64 這個術語。
I: int
L: long
P: pointer

int i=5;
if (i < 123)

這個 123 是什麼 type 呢? 根據 p174 表 14.2 可以知道 123 是 int, 所以是 int 5 < int 123, 很單純。但有時候就不是這樣, 所以那些 Usual Arithmetic Conversion, Integer Promotion 才那麼複雜。

15.3 介紹了 side effect, sequence point, 就是 a = a++; 這種煩人的東西。

而第 17 章 - x86 匯編程序基礎 (組合語言基礎), 讓人受用, 藉由 readelf 讓我得知 obj 和 elf 執行檔案的內容, 雖然只是短短的一章, 需要不少腦力, 若在書店看, 得好好找張椅子慢慢消化, 買回家讀還是舒服些。內容和程式設計師的自我修養 - 連結、載入、程式庫很類似, 不過提到的東西比較少。若看的吃力, 那讀程式設計師的自我修養可能會難了點。

chapter 18 從 c runtime crt*.o 開始, 分析這些 .o, 當然要出動 objdump。在分析變數是怎麼儲存在記憶體、執行檔裡頭以及 bss, 我認為這個有點難, 看不懂對於學習 c 不成問題, 但搞懂會為你的功夫打下基礎, 再也沒有任何事情可以難倒你。

volatile 的解釋也很棒, 用反組譯來帶你理解這個關鍵字, 可不是沒感覺的文字描述而己。

chapter 19 詳細解釋 linker 的行為, 對於初學者這太難了。看不懂先跳過吧! 我都搞不清楚這到底是入門書還是進階書了。

chapter 21 講述 makefile 讓我對 make 有了另外的認識, 我覺得很受用, 書上提供了 gcc -MM 的 makefile rule, 在大型程式中很好用。

23.6 介紹了不定個數的參數, 就是 printf 的參數用法, 可不是單純講解 va_ 那 3 個 function, 還自己實作這三個 function, 又是有點難的小節。

chpater 24 介紹了 c 標準程式庫, 還介紹了 man page 的看法。

附錄 A 講述 unicode, utf8 編碼, 短短的篇幅卻給了很基本的觀念。

官網 (作者宋劲杉開放這本書, 本書可在這裡取得電子版本, 這真是不簡單): http://learn.akae.cn/media/index.html
http://songjinshan.com/akabook/zh/index.html

old version: http://akaedu.github.io/book/

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。