C中的经典,经过半个月的时间,慢慢的看了,感觉挺好的!做了点小总结
在初读《C陷阱与缺陷》时,前几章介绍的问题经常遇到,较容易掌握。又因懒
于动手未做笔记,越到后面越觉得自己记忆力有限才补做笔记。毕竟好记性不如烂笔
头。前四章时在别的笔记中粘贴过来。后面几章的学习中遇到似是而非的问题也参照
了其他人得笔记并整理出自己的东西。现在一并发出来,为更多的人提供参考。
让我们一起坚定的走下去!
第1章 词法“陷阱”
1.1 = 不同于 ==
== 为比较运算符, = 为赋值运算符
例: while( c = ' ' || c == '\t' || c == '\n' )
c = getc( f );
本意是c和 ' ' 比较,但错用成赋值符。这样的后果是将 ' ' || c == '\t'
|| c == '\n' 这个表达式的值给了c, 而使c = 1。
同样: if ( ( filedesc == open( argv[i], 0 ) ) < 0 ) error();
open的返回值和filedesc比较的结果只能是0或1,所以,error没有机会调用。
但是,此时filedesc的值于open返回值无关,编译器这里不会报错。容易被忽视,
达不到检查效果。
1.2 & 和 | 不同于 && 和 ||
&和|均为按位运算符,而&& 和 || 均为逻辑运算符,不能混淆。
1.3 语法分析中的“贪心法” 当C编译器读入一个字符后又跟了一个字符,那么编译器就必须做出判断:是将其作为两个
分别的符号对待,还是合起来作为一个符号对待。C语言对这个问题的解决方案可以归纳为
一个很简单的规则:每一个符号应该包含尽可能多的字符。
a---b 与 a -- - b 的含义相同,而与 a - -- b 的含义不同。
1.4 整型常量
如果一个整形常量的第一个字符是数字0,那么该常量将被视作八进制数。因此,10
和010是完全不同的含义。此外书中还介绍了一些ANSI C不允许的做法,比如将8
和9也作为八进制数字处理。
1.5 字符和字符串
C语言中的单引号和双引号含义迥异,在某些情况下如果把两者弄混,编译器并不会检测报
错,从而在运行是产生难以预料的结果。
用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字
符集中的序列值。
用双引号引起的字符串,代表的却是一个指向无名数字起始字符的指针,该数组被双引
号之间的字符以及一个额外的二进制为零的字符''初始化。
然而,某些C编译器对函数参数并不进行类型检查,特别是对printf函数的参数。因此,
如果用
printf(' ');
来代替正确的
printf(" ");
则会在程序运行的时候产生难以预料的错误,而不会给出编译器诊断信息。
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新资格考试认证《C陷阱与缺陷》笔记全文阅读和word下载服务。
相关推荐: