- 词法“陷阱”
- 1.1 "=" 不同于 "=="
- 1.2 & 和 | 不同于 && 和 ||
- 1.3 词法分析中的“贪心法”
- 1.4 整型常量
- 1.5 字符与字符串
- 总结与练习
- 练习1-1:
- 练习1-2:
- AndrewKoenig自己在Bell实验室时发表的论文为基础,结合自己的工作经验扩展成这本对C程序员具有珍贵价值的经典著作。写作本书的出发点不是要批判C语言,而是要帮助C程序员绕过编程过程中的陷阱和障碍。
- 这本书可以当做补充材料来看,在遇到问题时有个排查方向。
在某些时候我们可能因为大意误将 ==写成=。导致程序在判断是出现错误。经常发生在条件语句下。比如:
while(c = ' ' || c == 't' || c == 'n') c = getc(f);
由于在比较字符 c与 ' '时候,误将==写成=,因此实际上是将以下表达式的值赋值给c。表达式: ' ' || c == 't' || c == 'n'由于' '的ASCII码值是固定不为0的,所以无论c为何值整个循环将一直进行下去,形成一个死循环。
如果把赋值运算写成比较运算一样容易混淆:
if((filedesc == open(argv[i], 0)) < 0) error();
- 这个问题一般应该不会发生。
C语言的某些符号,例如/、* 和 =,只有一个字长,称为单字符符号。 其他符号例如/* 和 ==包括多个字符的称为多字符符号。
在C编译器中将程序分解成符号的方法是,从左到右一个字符一个字符的读入,如果该字符可能组成一个符号,那就在读下一个字符,判断两个字符是否是一个符号的组成部分;如果是继续向下读,直到读的字符不能再组成一个有意义的符号为止。
需要注意符号的中间不能用空格例如==是一个符号而= =是两个符号。
表达式a---b与表达式a-- -b含义相同,而与表达式a- --b不同。
如果一个整型常量的第一个数字是0那么这个数一般表示为八进制数。因此10与010的含义是截然不同的。虽然一般都不会在前面加0吧。
1.5 字符与字符串 C中单引号与双引号的含义是截然不同的。某些情况两个符号写错是不会报错的。
下面这个两个printf语句是等效的。
printf("hello worldn");
char hello[] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', 'n', 0,};
printf(hello);
char *a = '/';在编译的时候可能会生成一条错误信息或警告。因为单引号中的元素,是一个int型的值;将这个值赋值给一个指针在调用的时候大概率会导致程序崩溃。
总结与练习这些小毛病平时不会出现,但如果因为大意出现了,找错往往是一部血泪史。
练习1-1:某些C编译器允许嵌套注释。请写一个测试程序,要求:无论是对于允许嵌套的编译器,还是对于不允许嵌套的编译器,该程序都能正常编译,但两种情况截然不同。
练习1-2:a+++++b的含义是什么?



