在条件表达式中,不会首先评估高优先级运算符

时间:2012-12-03 05:52:05

标签: java while-loop operators

看看以下代码:

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。我在这里想念一些简单的东西吗?

3 个答案:

答案 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;但它不会影响操作数值。