Java8运算符优先级:后缀运算符优先时为何++x - x++结果为0
Java 运算符优先级与表达式求值顺序问题解答
你混淆了运算符优先级和表达式求值顺序两个独立的语言规则,这是预期和实际结果不符的核心原因。
- 运算符优先级的作用仅为确定操作数和运算符的绑定逻辑,不会调整整个表达式的求值顺序。针对你给出的
++x - x++,由于后缀自增优先级高于减号、减号优先级高于前置自增,优先级规则最终会把表达式绑定为(++x) - (x++),到这里优先级规则的作用就已经完成。 - Java语言规范明确规定:所有二元运算符的操作数严格按照从左到右的顺序求值,该规则优先级高于运算符绑定规则。
代码执行过程拆解
你的代码片段:
int x = 3; int y = ++x - x++;
逐步骤执行逻辑:
- 初始状态:x赋值为3
- 优先计算减号左侧操作数
++x:前置自增会先修改x的值再返回运算结果,执行后x变为4,该操作数的返回值为4 - 再计算减号右侧操作数
x++:后缀自增会先返回当前x的值再修改x,执行后该操作数的返回值为4,x自增变为5 - 最后执行减号运算:用左侧操作数返回值4减去右侧操作数返回值4,得到结果0赋值给y
你之前的推导错误在于误认为后缀自增优先级更高就会跳过左侧操作数先计算右侧的x++,这是对优先级规则的典型误用。额外说明:这类修改同一变量的表达式在C/C++中属于未定义行为,但Java明确规定了从左到右的求值顺序,所以结果是确定的0。
内容的提问来源于stack exchange,提问作者jav
相关产品推荐
相关产品推荐

