Re: [討論] 沒有C語言的實戰經驗,要怎麼磨練?

看板Soft_Job (軟體人)作者 (髮箍)時間4年前 (2021/07/25 03:32), 4年前編輯推噓9(9016)
留言25則, 12人參與, 4年前最新討論串6/6 (看更多)
建議可以看看《C How To Program》, 它的範例程式碼品質不錯, 文字說明也夠多, 多做練習題可以幫助你理解語意. 不過有個觀念需要釐清的是: C 語言程式是跑在抽象機器 (abstra- ct machine) 而不是實體機器上 (只存在想像的虛擬機器), 所以它 和你的應用偏底層與否其實沒什麼關係. C 語言規範了抽象機器的 行為, 並且要求編譯器的輸出在實體機器上的執行結果要和抽象機 器相同 (5.1.2.3/1). 增加這層抽象化可以確保程式碼可攜, 只是撰寫時需多留意這個觀 念, 避免將實體機器的屬性嵌進程式碼裡. 如 sizeof 運算子是對 物件大小資訊的封裝; 但如果喜歡「從做中學」: printf("sizeof(int) is: %zu\n", sizeof(int)); // (possible) output // sizeof(int) is: 4 因此得到「int 大小為 32 bits」的結論, 那就本末倒置了. 這類 錯誤結論反而會讓你遇到更多 undefined behavior, 影響學習成效 ; 而偏底層應用則是需要活用 implementation-defined behavior. 《C How To Program》一書最強調的就是可攜性, 這點和語言設計 理念相同, 基本上把這本讀熟就能具備工作需要的語言知識. 你反 而得花更多時間去補充領域知識 (domain knowledge). - References ISO/IEC 9899:202x (E) (N2596) http://open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf C99 Rationale http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf -- [P1389R1] Standing Document for SG20: Guidelines for Teaching C++ to Beginners https://wg21.link/p1389r1 SG20 Education and Recommended Videos for Teaching C++ https://www.cjdb.com.au/sg20-and-videos -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.233.156.253 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1627155123.A.D23.html

07/25 07:02, 4年前 , 1F
謝大大分享
07/25 07:02, 1F

07/25 09:12, 4年前 , 2F
07/25 09:12, 2F

07/25 09:25, 4年前 , 3F
感謝
07/25 09:25, 3F

07/25 10:20, 4年前 , 4F
資料型別在不同的機器或實作上會有不同大小這點真的很煩
07/25 10:20, 4F

07/25 10:20, 4年前 , 5F
…XD
07/25 10:20, 5F

07/25 10:41, 4年前 , 6F
所以才有int32_t int64_t啊
07/25 10:41, 6F

07/25 12:37, 4年前 , 7F
搞int32_t和int64_t又脫離抽象層變成實體層啦
07/25 12:37, 7F
intN_t 主要是給予 bit-pattern 的保證, 而且編譯器也可以選擇 用軟體支援如 __int128 的操作, 所以還是足夠抽象的.

07/25 12:45, 4年前 , 8F
我看不出來那本書有最強調可攜性耶 至少文字上很少
07/25 12:45, 8F

07/25 12:46, 4年前 , 9F
後面還塞一堆C++ 不知道現在還有沒有
07/25 12:46, 9F

07/25 17:17, 4年前 , 10F
C 語言強調自己是運作在假想機器上,怎麼有種智能障礙者
07/25 17:17, 10F

07/25 17:17, 4年前 , 11F
強調自己是用智力來學習的感覺...
07/25 17:17, 11F

07/25 17:17, 4年前 , 12F
錯是沒錯啦 orz
07/25 17:17, 12F

07/25 21:49, 4年前 , 13F
因為很多人真的以為c可以完全翻譯成組語
07/25 21:49, 13F

07/25 21:50, 4年前 , 14F
其實在現代編譯器作用下 就算是c語言你也不容易猜到
07/25 21:50, 14F

07/25 21:50, 4年前 , 15F
背後被生成什麼組語了
07/25 21:50, 15F

07/25 21:53, 4年前 , 16F
忽略bit數本來就是錯誤的抽象啊...變數的corner case
07/25 21:53, 16F

07/25 21:53, 4年前 , 17F
本來就該在寫的時候被考慮 它也是程式邏輯的一部分
07/25 21:53, 17F
int 等型別的抽象化已經做夠足了, 如極值 (INT_MAX), 位元數 (INT_WIDTH) 等, 可以在大多數情境下使用. 因為這裡不是專板提 太多就失焦惹.. 0rz

07/25 22:10, 4年前 , 18F
謝謝分享
07/25 22:10, 18F
※ 編輯: loveme00835 (118.233.156.253 臺灣), 07/25/2021 23:08:11

07/26 16:00, 4年前 , 19F
我也不認同"C 語言強調自己是運作在假想機器上".
07/26 16:00, 19F

07/26 18:33, 4年前 , 20F
C 是有某種程度的抽象話,但這年頭說假想機器或 abstrac
07/26 18:33, 20F

07/26 18:33, 4年前 , 21F
t machine,我第一個會想到的是 JVM 或 LLVM 這類的東西
07/26 18:33, 21F

07/26 18:33, 4年前 , 22F
07/26 18:33, 22F

07/26 20:30, 4年前 , 23F
c有llvm後端ㄚ
07/26 20:30, 23F

07/26 20:45, 4年前 , 24F
其實是新機器為了讓C語言跑更快,所以設計的像C的假想機器
07/26 20:45, 24F

07/26 20:46, 4年前 , 25F
不然早期處理器設計百花齊放
07/26 20:46, 25F
文章代碼(AID): #1W_6gpqZ (Soft_Job)
文章代碼(AID): #1W_6gpqZ (Soft_Job)