问答详情
源自:-

小白求解各种运算的先后顺序

比如; int a = 3; b = 4;计算a+b%a-b/a+a*b-a++该算式的运算结果以及运算后a的值

提问者:拥抱蓝天 2015-08-23 00:49

个回答

  • onemoo
    2015-08-26 13:36:30
    已采纳

    前面你说的“但假如是认为a++是先取值而后运算,而a本身并未受到这个运算的影响的话”——你可以这么理解,但你后半句“可以得出“c语言入门”3-4的答案是12”——正相反,恰恰无法得出这个结论。

    a++表达式的值就是a当时的值,在当时a的值可以说是不受这个运算的影响的。但a的值最终还是要自增的,只不过这个自增是什么时候发生的是不确定的,那么整个表达式中前面那几个a的值该取多少呢?不确定! 你无法确定前面那几个a是不是已经自增过了,这是因为C标准没有规定操作数的求值顺序。表达式是有优先级的,但是优先运算的表达式的操作数不一定是优先求值,反之亦然。加之a自增的时点本来就不确定,所以无法确定这些a到底该是什么值,那整个表达式的值也就是不确定的了。

    如我在那个帖子中最后的那个建议所说:如果有表达式改变了一个操作数的值,那就不要在这个复合表达式中再次使用这个操作数。除非你能确定“改变值”和“使用值”的先后顺序。

  • onemoo
    2015-08-23 14:52:03

    首先说:这题目出错了!

    这道题与运算符优先级无关,这个表达式的值是不确定的。

    根据优先级,最后的a++先算,a++的值为4,但是a本身的值是什么时候自增的?这是不确定的。所以式子中前面那些a的值也是不确定的。


    对上面的解答有疑惑,请看这里 http://www.imooc.com/qadetail/64864 我的回答,我懒得复制过来了...

  • hhh112123123
    2015-08-23 14:15:55

    从左到右,先乘除取模,后加减  这一题结果是12  a运算后为4(运算时为3)