《C陷阱与缺陷》——第一章(词法陷阱)

索引
《C陷阱与缺陷》——第二章(语法陷阱)

1.赋值运算符“=”与比较运算符“==”

对于赋值运算符“=”,如果用于逻辑判断时,其逻辑值是0或者非0值。

对于比较运算符“==”,逻辑值只有0或者1

这里直接使用《C陷阱与缺陷》中的例子为大家举例。

例如:

while(c=' '||c=='t'||c=='\n')
      c=gets(f);

原意是跳过文件中的空格符、制表符和换行号,而此时c被赋予了‘ ’,并且赋值运算符=的优先级要低于逻辑运算符||,因此是将以下表达式赋值给了c:

' '||c=='t'||c=='\n'

并且‘ ’的ASCII值不为0,因为逻辑运算符||中头一个表达式为真则后面的运算或判断不再进行,所以c此前不论为何值时,结果都为真,因此循环一直进行下去直到整个文件结束。

2.按位与&,按位或|,逻辑且&&,逻辑或||

按位与&:&是一个双目运算符,可以用于两个数值的计算,并且是两个数值的补码进行按位与运算。&运算符的特点是,如果两个数值比较中有一个为假则整体为假。例如1与0,1&0结果为0。

按位或|:|也是一个双目运算符,|的特点是两个数值的运算其中有一个真则结果为真。例如1|0,结果为1。

逻辑且&&:双目运算符,主要用来判断真假,或者作为一个循环语句的条件进行使用。例如x=3;if(x<4&&x>2),则能够进入该循环语句中。特点仍为两个数值的运算其中有一个假则结果为假。

逻辑或||:双目运算符,主要用来判断真假,或者作为一个循环语句的条件进行使用。例如x=3;if(x<6||x>4),则判断条件不成立,无法进入循环语句中。特点仍是两个数值的运算其中有一个真则结果为真。

&&与||逻辑运算都是从前往后开始判断的,只要某一个判断条件成立后,后面的判断条件或运算则无需继续进行。例如:x=2;y=3;if(x>3&&y=5),因为2大于3不成立,则y=5的判断语句不会再进行,||逻辑操作符也是如此。

3.词法分析中的“贪心法”

贪心法解释:编译器将程序分解成符号,从左到右一个一个字符读入,如果读入的字符组成的是字符串、有意义的符号,就继续读,直到读入的字符组成的字符串不能组成一个有意义的符号,那么该读入所组成的字符串即为一个符号。

我们直接用例子来进行说明:
例一:a- - -b其实与a-- -b是等价的,而与a- --b不同。这是什么原因呢?

因为- -是一个单目操作符,能进行减1的运算。再往后读,则为- - -,不够成一个操作符,因此- - -被分为了- -与-。

例二:y=x/*p这个表达式是什么意思?原意是将p这个指针解引用之后再用x除以 *p赋值给y,但此时并非如此。

原因是:编译器从x往后读符号遇到‘\’,此时往后继续读符号遇到‘*’,再往后读遇到p,\ *p这个字符串没有意义,因此\与 * 连在一起能够形成注释符。

4.整型常量

如果整形常量的第一个字符是数字0,那么该常量被视作八进制,例如8为一个十进制数,而08则为一个八进制数。一般写为08编译器会报错。(即使用10进制打印)

5.字符与字符串

用单引用引起的一个字符,实际是一个整形数。根据ASCII原则,每个字符对应一个十进制数。

对与双引号引起的字符串,其实质:是一个无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制为0的字符串结束标志‘\0’初始化。

因此单引号实质是整形,双引号实质是指针。混用时,编译器会检查出来。

对于‘yes’这种是合法的,但是对于不同编译器,其对应整数不同。

Borland C++ v5.5和 LCC v3.6 中的做法是:忽略多余字符,最终整数值是第一个字符的整数值.
Visual C++ 6.0和 GCC v2.95中做法是:忽略多余字符,最终整数值是最后一个个字符的整数值.

6.练习

a+++++b的含义是什么?
解析:编译器a往后开始读入符号,首先读入+,再往后读为++,再往后读为+++,此时+++没有任何意义,因此先将上述表达式分为a++ +++b,在原来的基础上继续往后读,先读入+,再往后读为++,再往后读为+++,此时+++没有任何意义,因此表达式最后被分为((a++)++)+b。

原创不易,如果此篇文章对你有帮助,麻烦点个赞谢谢!

  • 22
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zjruiiiiii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值