请教一个比较弱的问题……
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,难道加法运算要最后最后才执行吗?
谢谢了先!
请教一个比较弱的问题……
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,难道加法运算要最后最后才执行吗?
谢谢了先!
x += x+++x;
根据c语言的贪婪匹配原则,会被认为是x+=(x++)+x;x在+=时为11了,x+++x是10+11,最后应该是11+10+11,不过这是我自己猜的,这种在一个表达式中多次修改变量值的行为是ub,会因为编译器不同可以有不同结果。
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.3k 阅读✓ 已解决
1 回答3.3k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.5k 阅读
3 回答511 阅读✓ 已解决
后置运算符++并不是等到整条语句执行结束才完成对变量的+1操作,是变量State与运算符++这个表达式执行结束后就完成,所以state += (state++) + state,相当于11 += 10 + 11。最终等于32。
这个问题,其实你反汇编一下就明白了。高级语言隐藏了很多实现细节,看看汇编能给自己更加清晰的认识。说白了就是编译器对不同grammar的处理细节隐藏的太深,官方其实有grammar以及相关的spec,但是有些抽象,还不如反汇编方便。
为了加深理解可以,但是应该避免这样的代码,可读性太差。