假设我们有这样的代码:
int k=1;
System.out.println(k++ * ++k);
输出将是三,这就是我的问题。总是这样的情况下,Java,而不是先阅读整行,并将预指令与后指令分开,从而将其视为:
int k=1;
k+=1;
System.out.println(k*k);
k+=1;
...只是从左到右阅读?或者它是依赖编译器的,不应该依赖它?
答案 0 :(得分:3)
k++ * ++k
从左到右进行评估。
<强>解释强>
k++
:首先使用k的原始值(即1)++k
:先增加k然后再使用。所以k现在是3。当k的初始值为1时,k++ * ++k
变为:1 * 3
,结果为3.
请注意,子表达式的副作用在Java中定义良好,这使得该表达式在Java中有效。像k++ * ++k
这样的表达式会导致C或C ++中出现未定义的行为。所以一般要避免这样的表达;)
答案 1 :(得分:2)
这是由运营商根据语言规范定义的运算符。对于您的第一个示例,*
运算符的规则在JLS 15.17中定义:
乘法运算符具有相同的优先级,并且在语法上是左关联的(它们从左到右分组)。