Java运营商是否始终从左到右阅读?

时间:2012-12-19 18:03:51

标签: java operators

假设我们有这样的代码:

int k=1;
System.out.println(k++ * ++k);

输出将是三,这就是我的问题。总是这样的情况下,Java,而不是先阅读整行,并将预指令与后指令分开,从而将其视为:

int k=1;
k+=1;
System.out.println(k*k);
k+=1;

...只是从左到右阅读?或者它是依赖编译器的,不应该依赖它?

2 个答案:

答案 0 :(得分:3)

k++ * ++k

从左到右进行评估。

<强>解释

  • k++:首先使用k的原始值(即1)
  • 之后增加k,所以现在k是2。
  • ++k:先增加k然后再使用。所以k现在是3。

当k的初始值为1时,k++ * ++k变为:1 * 3,结果为3.

请注意,子表达式的副作用在Java中定义良好,这使得该表达式在Java中有效。像k++ * ++k这样的表达式会导致C或C ++中出现未定义的行为。所以一般要避免这样的表达;)

答案 1 :(得分:2)

这是由运营商根据语言规范定义的运算符。对于您的第一个示例,*运算符的规则在JLS 15.17中定义:

  

乘法运算符具有相同的优先级,并且在语法上是左关联的(它们从左到右分组)。