弱问C++里怎么理解x+++x

请教一个比较弱的问题……

    int x = 10;
    x += (x++)+x;
    cout << x << endl;
    // 结果为32

我的理解是,x = x+(x++)+x = 31才对。请问难道应该理解成x = (x++)+(x++)+x 还是 x = x+(x++)+(x++)吗?

对于变量 y+=z = y+z,难道加法运算要最后最后才执行吗?

谢谢了先!

阅读 5.1k
4 个回答

后置运算符++并不是等到整条语句执行结束才完成对变量的+1操作,是变量State与运算符++这个表达式执行结束后就完成,所以state += (state++) + state,相当于11 += 10 + 11。最终等于32。

这个问题,其实你反汇编一下就明白了。高级语言隐藏了很多实现细节,看看汇编能给自己更加清晰的认识。说白了就是编译器对不同grammar的处理细节隐藏的太深,官方其实有grammar以及相关的spec,但是有些抽象,还不如反汇编方便。

为了加深理解可以,但是应该避免这样的代码,可读性太差。

x = x + (x++) + x = 10+11+11=32
在最后一个x,因为之前已经执行过x++了,所以此时的x已经改变了。

x += x+++x;
根据c语言的贪婪匹配原则,会被认为是x+=(x++)+x;x在+=时为11了,x+++x是10+11,最后应该是11+10+11,不过这是我自己猜的,这种在一个表达式中多次修改变量值的行为是ub,会因为编译器不同可以有不同结果。

我的理解:x= x+(x++)+x =((x+(x++))+x)=10+11+11=32;括号运算优秀级最高,第一个x是10,后面x已经是11;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题