Java中运算符与括号优先级问题:a+=5+(++a)+(a++)结果为何是22?
关于
a+=5+(++a)+(a++)计算结果的疑问解答 先看你的代码:
int a=5; a+=5+(++a)+(a++);
你预期的计算过程是a = 7 + 5 + 6 + 6得到24,但实际运行出22,核心原因是这段代码属于C++里的未定义行为,不是括号优先级能解释的。
在C++标准里,同一个表达式中如果多次修改同一个变量,且这些修改操作之间没有「序列点」隔开,程序的行为就没有明确规定——编译器可以自由选择各个子表达式的计算顺序,不同编译器、不同优化级别都可能给出不同结果。
你假设括号里的++a会先执行,但实际上编译器完全可以先计算a++,或者先取a +=里左边a的初始值再计算右边的表达式。比如得到22的可能路径:
- 计算
a += ...时,先取左边a的初始值5(后续用来做加法的基础值); - 计算右边的
5+(++a)+(a++):- 先执行
++a,a变成6,取6参与计算; - 再执行
a++,取当前a的值6参与计算,之后a变成7; - 右边表达式结果是5+6+6=17;
- 先执行
- 最后执行
a = 5 + 17,得到22。
反过来,如果编译器选择先算++a再算a++,同时在计算a +=时用最后修改后的a值,就会得到你预期的24,但这同样是允许的——因为未定义行为的结果本来就没有统一标准。
简单说:这种在一个表达式里反复修改同一个变量的写法,本身就是错误的,不要这么写。
内容的提问来源于stack exchange,提问作者Aman Maddhesia
相关产品推荐
相关产品推荐

