第一章: 词汇陷阱:
1.1 = is not == :
一、 因为在C语言中更多地使用赋值语句, 所以 = 要比 == 更方便赋值:
1、 if( x = y ) break; // 错误,把赋值的 = 误以为是 == ;
2、 为了跳过空格,tab,回车的循环:
while( c = ' ' || c == '\t' || c == '\n' )
c = getc(f);
// 错误: 错误的应用了 = , 使得 c 被赋值为 ‘ ’ ,所以语句恒为一!
3、 避免 if 判断语句中出现错误:
if( x = y )
foo();
可以写为:
if( ( x = y ) != 0 )
foo();
使目的变得简明!!
4、 判断一个文件是否可以正常被打开的if:
if( ( filedesc == open(argv[i] , 0) ) < 0 )
error();
这个语句尝试 存储文件的同时,判断是否成功;
错误: 应当为 = ,此时可以实现赋值的同时完成判断功能,
1.2 & and | are not && or || :
& 和 | 按位与;
&& 和 || 逻辑与和逻辑或;
1.3 Greedy lexical analysis :
判断在一个很长的语句中,个个成分之间是如何链接为一个整体的:
Token : 在C语言中多个成分组成一个完整的元素 称为 Token;
在C语言中的解决方法是:( maximal much )
repeatedly bite off the biggest possible piece:
1. move from left to right( or left to right );
2. taking the longest possible token each time;!!
1、Token 的判断:
a---b; 表示 a-- - b ,即 (a--) - b;
2、尝试将 y 赋值为 x 除以 *p的内容的商:
y = x /* p;
错误:系统将认定 /* 为 注释, 结果将 x 的值 赋值给 y;
3、老式的C语言编译器出现的问题:
C语言编译器允许接受 =+ ,和 += 是同一个意思;
如: a =- 1; 可能表示 a = a - 1; 但也可能表示 a = -1 !
1.4 Integer constants : (整数常量)
需要注意的是 对于数字:
10 和 010 表示的是不同的数,(后者表示八进制);
并且在许多的C语言编译器中允许出现超过八进制的数字:
例如: 0195 表示 1*8^2 + 9*8^1 + 5*8^0 !!! 所以等于 141 十进制数!
1.5 Strings and Characters : (字符和字符串!)
在C语言中 ‘’ 和 “ ” 表示两个完全不同的东西!
对于单引号‘ ’ : 表示一个字符, 其实质是一个数字;
对于双引号“ ”: 表示一个字符串,其实质是:
一个存放连续字符 和 ‘\0’ 的一个头指针!
1. 对于字符和字符串的转化:
例如: printf("HelloWorld\n");
等价于: char hello[ ] = { H, e , l , l ,0 ........};
2. 对于一个单个的反斜杠:
注: char *Slash = ‘\0’; // 这是没有意义的, 反斜杠为 '\\' !!!
3. 对于 ‘\n’ :
注: 将 printf("\n") 替换为 printf(‘\n’) 有可能发生意想不到的错误;!