建议可以看看《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