看看下面的代码:
class experiment{
public static void main(String[] args) {
int k = 3;
while (k-- > 0) {
System.out.println(k + "n");
}
}
}
预期产出:
2
1
实际输出:
2
1
0
后缀运算符的优先级高于操作运算符。因此,k--
应该在k > 0
之前先进行评估,但查看输出,k > 0
首先被评估。我在这里错过了一些简单的东西吗?
它无关。"k--"的值是"k"。后递减"k"有一个副作用,但它不会影响操作数值。
是的,你是对的。 将首先评估k--
。但它真的被评估为k
.在当前涉及它的操作完成后,它的价值会增加。因此,首先使用当前值,然后发生增量。
如果你使用--k
,你会得到预期的输出。
只需尝试这些示例,您就会明白: -
int k = 4;
System.out.println(k-- + " : " + k); // prints 4 : 3
int x = 5;
System.out.println(--x + " : " + x); // prints 4 : 4
你是对的,k--
是在> 0
之前评估的。然而,该评估的结果是k
的,而不是k - 1
的,因为--
是后修复的,而不是前缀的。
所以,第一次计算>
时,它实际上是3 > 0
的,因为虽然k
现在是2
,但表达式k--
的结果是3
。但是,当打印出来时,k = 2
,因此首先输出2
。这就是为什么你得到的迭代比(我猜)你预期的要多。