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

来源:3-8 练习题

qq_没疯度_0

2015-08-15 11:56

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

写回答 关注

1回答

  • onemoo
    2015-08-15 16:09:43
    已采纳

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

    通常说,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。

    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 23:44:12

    共 3 条回复 >

C语言入门

C语言入门视频教程,带你进入编程世界的必修课-C语言

926938 学习 · 21533 问题

查看课程

相似问题