假设我们有这样的代码:
int k=1;
System.out.println(k++ * ++k);
输出将是三个,这就是我的问题所在。Java是否总是如此,而不是首先阅读整行并将前指令与后指令分开,从而将其视为:
int k=1;
k+=1;
System.out.println(k*k);
k+=1;
...只是从左到右阅读?还是它依赖于编译器并且不应该依赖?
k++ * ++k
从左到右进行评估。
解释:
k++
:首先使用k的原始值(即1)++k
:先增加k再使用。所以 k 现在是 3。k 的初始值为 1,k++ * ++k
is 变为:1 * 3
,结果为 3。
请注意,子表达式的副作用在 Java 中是明确定义的,这使得该表达式在 Java 中有效。表达式 likek++ * ++k
会导致 C 或 C++ 中的未定义行为。所以一般避免这样的表达;)
这是由语言规范逐个运算符定义的。在您的第一个示例中,*
运算符的规则在JLS 15.17中定义:
乘法运算符具有相同的优先级并且在语法上是左结合的(它们从左到右分组)。