1.1 =不同于==
=
用作赋值运算;==
用作比较运算- 注意不要错误地将循环语句中的比较符
==
和赋值符=
混淆 - 循环条件中如果同时用到赋值与比较,尽量使用括号对表达式进行区分
1.2 & 和 | 不同于 && 和 ||
- 按位与
&
和按位或|
运算符不要与 逻辑运算符 且&&
和 或||
混淆
1.3 词法分析中的“贪心法”
贪心法是指C语言识别多字符的方法,从左到右尽可能多的读入字符,如果该字符可能组成一个符号,则继续读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。
因为贪心法的特性,如果不规范编写则会引发二义性,例如。
y = x/*p
本意是用 x 除以 p 所指向的值,得到的结果赋给 y ,但编译器会解读为 /*
之后是一段注释,不再读入,所以就变成了将 x 的值赋给 y,与原本的编写意图风马牛不相及。
所以在涉及到带符号的变量时尽量和运算符之间用空格相隔,或是直接用括号区分。
1.4 整型常量
注意不同进制的整形常量的格式。十进制不可为了格式对齐使用 0 进行补齐。
1.5 字符与字符串
“ ”
引起的字符串代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制值为零的字符‘\0’
初始化。
printf("hello")
等同于
char a[] = {'h' , 'e' , 'l' , 'l' , 'o' , 0}
printf(a);
- 单引号引起的一个字符实际上代表一个整数,数值对应于该字符在编译器所采用的字符集中的序列值。
- 整型的存储空间可以容纳多个字符,例如
'yes'
代替"yes"
编译器不会检测到错误,但实际结果却相差甚远,前者是一个常量,而后者是依次包含三个字符和\0
的4个连续内存单元的首地址。