[C陷阱和缺陷] 1-词法“陷阱”、2-语法“陷阱”

有感自己的C语言在有些地方存在误区,所以重新仔细把"C陷阱和缺陷"翻出来看看,并写下这篇博客,用于读书总结以及日后方便自身复习。

第1章 词法“陷阱”

1.1 =不同与==

= 是赋值操作符,而 == 是作为比较操作符,初学者容易将 == 错写为 =,这种情况下编译器不会报错,这就有可能造成很严重的后果,还不容易发现。比如下面这个例子:

while( c=' ' || c=='\t' || c=='\n' ) { ; }

即使c既不等于'\t',也不等于'\n',但由于‘ ’赋给c,‘ ’不为0,所以while始终为真,成为死循环。所以有时采取下面这张写法,就能尽可能地避免这种错误(个人不太喜欢),即使错写为 = ,编译器也会报错进行提醒:

while( ' '=c || '\t'==c || '\n'==c ) { ; }

1.2 词法分析中的“贪心法”

当编译器读入一个字符‘/’后又跟了一个字符'*',那么编译器就必须做出判断:是将其作为两个独立的符号对待,还是合并起来作为一个符号对待。C语言对这个问题的解决方案可以归纳为一个很简单的规则:每一个符号应该包含尽可能多的字符。

也就是说,编译器将程序分解成符号的方法是,从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断两个读入字符合并成的字符串是否可能是一个字符的组成部分;如果可能,继续读入下一个字符,重复上述判断,
直到读入的字符组成的字符串已不再可能组成一个有意义的符号。这个策略有时被称为“贪心法”。

需要注意的是,除了字符串和字符常量,符号的中间不能嵌有空白(空白、制表符、换行符)。例如,==是单个符号,==  是两个符号,表达式  a---b  与 表达式  a -- - b的含义相同,与表达式a - --b的含义不同。

下面这个例子:

y = x/*p; //x除以p指向的内容

而实际上,/*被编译器理解为一段注释的开始,也就是说,该语句会将 x 之间赋给y,后面全是注释。必须这么写才对:

y = x / *p; //正确

或者更加清楚一点,使用括号:

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

1.3 整型常量

猜你喜欢

转载自www.cnblogs.com/linuxAndMcu/p/9949193.html