首页 > 代码库 > C陷阱与缺陷之词法陷阱
C陷阱与缺陷之词法陷阱
该文章及后续文章均为阅读《C陷阱和缺陷》后的读数笔记,方便以后回顾
C陷阱和缺陷电子版图书下载地址:点击打开链接
第一章词法陷阱
1.1 = 不同于 ==
在C语言中,符号=作为赋值运算符,符号==作为比较运算符。一般而言,赋值运算相对比较运算出现得更频繁,因此字符数较少的符号=就被赋予更常用的含义——赋值操作。在编写程序的时候,注意不要将赋值操作写完比较相等的操作,也不要将比较操作写为赋值操作。
1.2 & 和 | 不同于 && 和 ||
在C语言中,&和|为按位运算符,它们对操作数的处理方式是将其视为一个二进制的位序列,分别对其每位进行操作。
&&和||为逻辑运算符:其处理结果通常为“真”或者“假”,&&和||运算符在其左侧操作数能够确定最终结果时根本不会对右侧操作数求值。
1.3 词法中的“贪心法”
C语言中既存在单目运算符,也存在多目运算符。那么当编译器读入一个字符‘/‘后又跟一个字符‘*‘时,那么编译器就必须判断是将其作为一个符号,还是作为两个分别的符号对待。C语言对这个问题的解决方案可以归纳为一个很简单的规则:每一个符号应该包含尽可能多的字符。也就是说,编译器将程序分解成符号的方法是,从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。这个处理策略有时被称为“贪心法”。
这样就解释了为什么表达式a---b的含义与a-- -b相同,而与a---b不同。
1.4 整型常量
如果一个整型常量的第一个字符是数字0,那么该常量将被视作八进制数。因此10和010所表示的数字截然不同。
1.5 字符和字符串
C语言中字符和字符串含义迥异,用单引号引起的一个字符实际代表上代表一个整数;整数值对应于该字符在编译器采用的字符集中的序列值,一般是ASCII字符集
用双引号引起的字符串,代表的却是一个指向无名字符数组起始字符的指针,该字符数组被双引号之间的字符以及一个额外的二进制值为0的字符‘\0‘初始化。