为了账号安全,请及时绑定邮箱和手机立即绑定

b++为什么不等于10???

在3-3一节中说了啊,不论是b++还是++b都是b=b+1,那么b=10啊??

正在回答

1 回答

所以说这个课程糟透了,很多都没讲清楚。

通常说,a++是先取值后运算,++a是先运算后取值。实际上这里涉及“运算符” “表达式”的概念。

++ 是一个“自增运算符”,自增运算符有两种形式:前置自增(++a)和后置自增(a++)。

运算符和操作数合起来就是一个表达式(a++、++a都是表达式,a就是操作数)。注意:每一个表达式本身都有值(和其类型),有的表达式还有“副作用”。比如自增表达式的副作用就是使其操作数自增1。那么自增运算表达式的值是什么呢? a++ 的值就是 a 的值,而 ++a 的值等于 a+1。 

所以如果b是9,b++的值就是9,在之后b的值会变成10(副作用),那么这个之后是什么时候呢?

这涉及到另一个关键内容“序列点”,副作用在序列点后保证会发生(请注意这一句的措辞)。序列点这个概念比较复杂,语句结束时算是序列点,逻辑运算符处也是一个序列点......还有其他的情况,就不细说了。总之序列点之前的运算符的副作用,在执行到这点以后都保证会发生。注意并不是在过了这一点后就突然发生的,这些副作用可能在序列点前的任何一个位置发生,C标准只是规定在序列点之后这些副作用必须已经发生了。

所以:

选项A: b++的值就是9,小于5*2,所以表达式前半部分为false,由于是逻辑与运算符,所以不再继续判断后半部分了,整个表达式就是false。

选项B: b++ >= a*2 还是false,因为是逻辑或运算符,所以继续判断后半部分,又因为逻辑运算符处为序列点,所以 b - a <= a 中的b已经自增了,值成10,10-5<=5为true。整个表达式为true。

选项C: 5*2-9 = 1,1的非为false。

选项D: ++b的值是9+1=10,10-5*2=0,0被视为false。

1 回复 有任何疑惑可以回复我~
#1

qq_没疯度_0 提问者

非常感谢!
2015-08-16 回复 有任何疑惑可以回复我~
#2

小白的梦想导师

老师,你看d选项【++b-a*2】这个为什么是9-10,为什么这里的++b也是9呢? 这里的b++ 以及++b 是说b的值还是副作用的值呢?
2015-12-04 回复 有任何疑惑可以回复我~
#3

onemoo 回复 小白的梦想导师

++b不是9啊!! 回答中我说的是“++b的值是9+1=10”,我的意思是++b的值为10! 之前说自增表达式有副作用,这个副作用会影响b的值,会使b的值增加1。 这与++b的取值不矛盾,++b的值就是“++b表达式”的值,它的值等于 b+1。 我前面强调的一点就是“表达式本身是有值的” 我在这里的回答似乎更清晰些 http://www.imooc.com/qadetail/83948
2015-12-04 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

b++为什么不等于10???

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号