-
=不同于==
下例中循环语句的本意是跳过文件的空格修饰符、制表符和换行符
while(c=''||c=='\t'||c=='\n')
{
c = getc(f);
}
{
c = getc(f);
}
由于疏忽,误将运算符==写成赋值运算符=。因为赋值运算符=的优先级要低于逻辑运算符||,因此实际上是将以下表达式的值赋给了c
' '||c=='\t'||c=='\n'
因为' '不等于零(' '的ASCII码值是32)所以无论变量c之前是何值,上述表达式的结果都是1,因此循环一直运行下去,直到文件结束
- 词法分析中的"贪心法"
当C编译器读入一个字符'/'后,又跟了一个字符'*',那么编译器就必须做出判断:是将其作为两个分别的字符对待还是合起来作为一个符号对待,C语言对这个问题的解决方案可以归纳为一个很简单的的规则:每个符号应该包含尽可能多的字符。
下面的语句本意似乎是x除以p所指的值,把所得的商赋给y:
y = x/*p /* p指向除数*/
而实际上/*被编译器理解为一段注释的开端,编译器将不断的读取字符,直到*/出现,也就是说该语句直接将x赋给y,根本不会顾及后面出现的p,将上面的语句重写如下:
y = x /*p;或者
y = x / (*p); //这才是程序员本意
y = x / (*p); //这才是程序员本意
特别注意:如果一个整型常量的第一个字符是数字0,那么该常量将被视作八进制数!!