第一章—词法“陷阱”
比如一个句子里面,我们要这个句子意思,就要弄明白每个单词的意思,但是我们不用去理会每个字母意思,单个字母本来就不存在意义。C语言程序也是同样的道理,独立的一个符号不存在意义,要将符号组合起来,才会产生意义。
举例:P->s="->",好明显,左边的“-”与右边的“-”是不同的意思,右边是一个字符串。左边是什么呢?
编译器里面有一个叫“词法分析器”的东西,是将程序分解成一个一个字符的高深东东。
重点1:=不同于==
我觉得很多程序员对这个“=不同于==”有深刻的体会,我也深感体会,因为我在写单片机C语言程序的时候经常将这两者搞错。
首先"="是赋值操作,而“==”就是比较操作。我就是经常无意识地将两者搞乱,经常犯错。
if(x=y) break; 这个语句有什么问题?我原本想表达的意思是,当x=y时,然后break.但现在呢,if(x=y)的意思是将y赋值给x,然后判断是否为0,再执行break;
还有一个不错的例子:
while(c= ' ' || c == '\t' || c == '\n')
c= getc(f);
由于赋值运算符=的优先级要低于逻辑运算符嘛,所以自然赋值运算符是最后执行的,答案就变为:
‘ ’ || c =='\t' || c == '\n' 赋值给c,又因为‘ ’的ASCII码是32,所以自然会将1赋值给c嘛。然后呢,然后呢。
就变成while(1);噢~~~NO.难道这不就是传说中的“死循环”吗? 大BUG出现了。
|