第1章 词法“陷阱”
程序中的单个字符孤立来看没有什么意义,只有结合上下文才有意义。
“符号”指的是程序的一个基本组成单元,其作用相当于一个句子中的单词。
同一组字符序列在不同的上下文环境中可能表示不同的符号。
C语言中,符号之间的空白(包括空格符、制表符或换行符)将被忽略。
●=不同于==
C语言使用符号=作为赋值运算,符号==作为比较。实际编程中可能会混淆两个符号,造成程序出错。
●&和|不同于&&和||
将按位运算符&与逻辑运算符&&,或者按位运算符|与逻辑运算符||混淆,也是很容易犯的错误。
●词法分析中的贪心法
C编译器读入字符的规则:每一个符号应该包含尽可能多的字符。也就是将字符从左到右一个一个地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。这个处理策略被称为“贪心法”或“大嘴法”。
注意:除了字符串与字符常量,符号的中间不能嵌有空白(包括空格符、制表符或换行符)。
●整型常量
如果一个整型常量的第一个字符是数字0,将被视作8进制数,实际编程中可能无意中将十进制数写成了八进制数。
●字符与字符串
用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。
用双引号引起的字符串,代表的却是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制值为零的字符'\0'初始化。
所以单引号和双引号含义不同,在某些情况下容易将两者弄混,造成程序出错。
tengjingshu_112148725 2009-4-2 09:29