课程“C陷阱与缺陷-疑难问题理解”是笔者在学习《C陷阱与缺陷》这本书时的读书记录,进行二次创作而成。通过“讲义+视频”方式帮助大家在短时间内学习《 C陷阱与缺陷》这本书,进而提升对C语言的理解。同时也是对自己学习成果的巩固。讲义和视频免费获取并且全部开源。
不知道你有没有这种感觉!总是觉得自己对C语言基本的语法和使用很了解,但是涉及到C语言的高级用法有总是感觉似懂非懂。另外通过视频方式自学C语言知识也感觉不完整,如果没有看书像是缺了点什么!认为看书才算是系统的学习。
通过在网上查找资料了解到《C陷阱与缺陷》这本书。深入研读这本书对自己启发很大。因此制作了《C陷阱与缺陷-关于C语言疑难问题理解》这本讲义并录制了配套的视频课程。通过学习该课程你可以不用花太多的时间去啃《C陷阱与缺陷》这本书。而是像大学时期“老师画重点”一样学习到《C陷阱与缺陷》这本书的全部精华。
学习课程“C陷阱与缺陷-关于C语言疑难问题理解”需要你有一定的C语言功底,适合一切想深入了解C语言的编程爱好者和开发者。网上很多人推荐《C陷阱与缺陷》这本书,可笑的是他们自己却没有看过。所以我想我已经花了这么多时间研究了这本书,为什么不做个教程帮助大家了解《C陷阱与缺陷》这本书呢,因此就诞生了《C陷阱与缺陷-关于C语言疑难问题理解》这本讲义及配套视频课程。
通过12个课时,每节课大约20-30分钟,具体安排如下:
概述-------------------------------------------------1课时
第一章 词法“陷阱”---------------------------------1课时
第二章 语法“陷阱”---------------------------------2课时
第三章 语义“陷阱”---------------------------------3课时
第四章 连接----------------------------------------1课时
第五章 库函数--------------------------------------1课时
第六章 预处理器-----------------------------------1课时
第七章 可移植性缺陷------------------------------2课时
如下例子:
while (c == '\t' || c = ' '|| c == '\n')
c = getc(f);
如上,这个例子在C语言中是非法的。因为赋值运算符=的优先级比while 子句中其他运算符的优先级都要低,因此上例可以这样解释:
while ((c == '\t' || c) = (' '|| c == '\n'))
c = getc(f);
当然,这是非法的:
(c == '\t' || c)
有时候我们还应该预料哪些错误有可能出现,在代码的编写方式上做到事先预防,一旦错误真正发生能够马上捕获。例如,有的程序员把常量放在判断相等的比较表达式的左侧。换言之,不是按照习惯的写法:
while (c == '\t' || c == ' '|| c == '\n')
c = getc(f);
而是写作:
while ('\t' == c || ' ' == c || '\n' == c)
c = getc(f);
这样,如果程序员不小心把比较运算符==写成了赋值运算符=,编译器将会捕获到这种错误,并给出一条编译器诊断信息:
while ('\t' = c || ' ' == c || '\n' == c)
c = getc(f);
上面的代码试图给字符常量’\t’赋值,因而是非法的。
如果像下面的代码一样调用这个函数:
int a[10];
set(a+5, 37);
这当然是合法的,但如果这样来调用set函数:
int a[10];
set(a+10, 37);
上面的代码就是非法的了。ANSI C标准允许程序得到数组尾端出界的第一个位置的地址,因此上面的后一个代码段从它本身来说并没有什么错误。C编译器要想捕获到这样的错误,就必须非常地“聪明”。