【问题标题】:Higher precendence operator doesn't get evaluated first in while condition's expression高优先级运算符不会在 while 条件表达式中首先被评估
【发布时间】:2012-12-03 05:52:05
【问题描述】:
看看下面的代码:
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 首先被评估。我在这里错过了一些简单的事情吗?
【问题讨论】:
标签:
java
while-loop
operators
【解决方案1】:
优先级与它无关。 “k--”的值是“k”。后减 'k' 有一个副作用,但它不会影响操作数的值。
【解决方案2】:
是的,你是对的。 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
【解决方案3】:
你是对的,k-- 在> 0 之前被评估。但是,该评估的结果是 k,而不是 k - 1,因为 -- 是后修复,而不是前修复。
所以,> 第一次被求值时,它实际上是 3 > 0,因为虽然 k 现在是 2,但 表达式 k-- 的结果是 @ 987654331@。但是,当打印出现时,k = 2,因此首先输出2。这就是为什么您获得的迭代次数比(我猜)您预期的要多。