看看以下代码:
class experiment{
public static void main(String[] args) {
int k = 3;
while (k-- > 0) {
System.out.println(k + "\n");
}
}
}
预期产出:
2
1
实际输出:
2
1
0
Postfix运算符的优先级高于运算运算符。因此k--
应首先在k > 0
之前进行评估,但在查看输出时,首先评估k > 0
。我在这里想念一些简单的东西吗?
答案 0 :(得分:1)
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
答案 1 :(得分:1)
你说得对,k--
在> 0
之前进行了评估。但是,该评估的结果为k
,而不是k - 1
,因为--
是修复后的,而不是预先修复。
因此,第一次评估>
时,它实际上是3 > 0
,因为虽然k
现在是2
,但表达式的结果< / em> k--
是3
。当打印出现时,k = 2
,因此2
首先输出。这就是为什么你得到一个迭代而不是(我猜)你期待的。
答案 2 :(得分:1)
优先权与它无关。 &#39; k - &#39;的价值是&#39; k。有一个副作用后递减&#39; k&#39;但它不会影响操作数值。