较高优先级运算符不会首先在条件表达式中得到计算



看看下面的代码:

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。这就是为什么你得到的迭代比(我猜)你预期的要多。

最新更新