这是大学的第一个暑假,我想在这个暑假里好好的学习一下,把前两个学期的知识在回顾一下,因此我决定再读一遍《C陷阱与缺陷》,这确实是一本相当好的书,我认为是学C者必看书籍之一,以下是我的读书笔记,会不断更新,如果断了就是没网了,开学会补上,希望对于学C的有所帮助吧。
第一章
1. 程序中的单个字符孤立起来看并没有什么意义,只有结合上下文才有意义。
你可以把写程序当做写作文似的。每一个“符号”是一个程序的基本组成单元,相当于一个句子中的单词,然后由单词组成句子,句子
组成文章,也就是说,“符号”组成语句,语句组成程序。符号是由字符序列组成,而字符序列在不同的上下文环境中的不同的符号,具有不同
的意义。在C语言中符号之间的空白符(空格、制表符、换行符)将被忽略。
2. =、&、|不等于==、&&、||。
在C语言中,=代表赋值运算,==代表比较运算;&代表地址运算或者按位运算,&&代表逻辑运算(并且);|表示按位运算,||表示
逻辑运算(或)。这是与某写语言中不同的地方,在某些语言(例如:Pascal)中不仅将=作为赋值运算符,也作为比较运算符,&&和||分
别用and和or表示。其中=与==最具代表性。例如下列语句:
本意是想比较x与y的大小,如果相等则执行foo函数,而实际是将y的值赋予x然后检查该值是否为0,为了避免这种情况,有些程序员会在常
量与变量进行比较时将常量写在比较符号的左侧,当符号错误时就 会报错。而一定要将两个变量进行比较而不希望编译器发出警告时应该显
示的进行比较,即:
3. “贪心法”。
“贪心法”也称“大嘴法”是C语言中对多字符符号进行区别的方法,规则很简单:每一个符号应该报好尽可能多的符号。除了字符串与字
符常量,符号的中间不能嵌有空白。例如a---b与a -- - b相同而与a - --b不同。在例题中a+++++b表示a ++ + ++b,根据大嘴法为什么
不是a ++ ++ + b呢?这是因为a++不能作左值。
4. 字符代表数字 与 字符串指向无名数组起始字符的指针。
C语言中的单引号和双引号含义迥异,在某些情况下如果将两者混合,虽然编译器不会检测出错误,但在运行时会产生难以预测的结
果。单引号引起的一个字符实际上代表一个整数,整数的值对应于该字符在编译器采用的字符集中的序列值。’a’代表97(十进制)。用双引
号引起的字符串代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制为0的字符’/0’初始化。
如:
printf(“Hello World”);
与
char h[]={‘H’, ’e’, ’l’, ’l’, ’o’, ’ ’, ’W’, ’o’, ’r’, ’l’, ’d’, ’/0’);
printf(h);
是等效的。如果你在程序中输入语
句char *p=’a’;,那么编译时就会报错。因为’a’不是一个字符指针。但是编译器对函数的参数是不进行检查的,尤其是printf函数的参数,
如果用printf(‘/n’);来代替printf(“/n”);将会产生不可预料的错误。