第01章 词法"陷阱"

《C陷阱与缺陷》 Andrew Koenig 读书笔记


1.1 =和==

编写时建议:
将变量放到==的后方,编译器可以检测误写成=的错误


int a=1;
if(1==a){
    //...
}

1.2 &和 | 不同于&&和 ||

1.3 语法分析的“贪心法”

c语言中符号有的只有一个字符长度(/ * =)有的是多个字符(/* ==)
编译器在判断时的规则是“
每个符号应该包含尽可能多的字符

也就是说:
编译器从左往右读字符,如果该字符可能组成一个符号,再读入下一个字符,判断这两个符号是否可以组成一个字符,如果可以,继续读入下一个字符,重复上述判断

举例:

a---b

的实际意图是:a-- -b即先a--然后将结果减b

而不是a- --ba减去 减减b

注意: 在写的时候加上空格,或者括号将更便于阅读。

y=x/*p;   //会解释为注释符号

y=x / *p; //正确解释为 x除以*p,因为/和空格不能组成一个符号

y=x/(*p); //正确解释 

1.4 整型常量

如果一个整型常量的第一个字符是数字0 ,该常量会被视作八进制

  • 159 是十进制整数159
  • 0159 是八进制,是十进制的141

注意:
在上下文中为了格式对齐,而无意中在十进制前添加了0

046
046
125

1.5 字符与字符串

' '的是字符
“ ”的是字符串

  • 单引号括起来的一个字符代表一个整数
  • 双引号括起来的一个字符代表一个指针

双引号的字符串代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及额外的一个二进制值为零的字符'\0'初始化

你可能感兴趣的:(第01章 词法"陷阱")