代码改变世界

[读书笔记] C 陷阱与缺陷

2010-03-20 21:27  bdictator  阅读(209)  评论(0编辑  收藏  举报
  • =不同于==

下例中循环语句的本意是跳过文件的空格修饰符、制表符和换行符

  while(c=''||c=='\t'||c=='\n')
  {
  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); //这才是程序员本意
特别注意:如果一个整型常量的第一个字符是数字0,那么该常量将被视作八进制数!!