1

假设我们有这样的代码:

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

输出将是三个,这就是我的问题所在。Java是否总是如此,而不是首先阅读整行并将前指令与后指令分开,从而将其视为:

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

...只是从左到右阅读?还是它依赖于编译器并且不应该依赖?

4

2 回答 2

3
k++ * ++k

从左到右进行评估。

解释:

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

k 的初始值为 1,k++ * ++kis 变为:1 * 3,结果为 3。

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

于 2012-12-19T18:12:40.173 回答
2

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

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

于 2012-12-19T18:08:34.793 回答