一元行动的优先权

时间:2012-03-26 16:56:14

标签: java

以下是输出6的示例:

public static void main(String[] args) {
    int i = 1;
    m(++i);
}

static void m(int i) {
    i = ++i + i++; 
    System.out.println(i);
}

我们得到6,因为在m(int i)方法33汇总后,i变为4(由于i++),但在左侧部分i采用汇总的6值。

但是如果方法改为以下,我们得到7

static void m(int i) {
    i = ++i + ++i; 
    System.out.println(i);
}

但我希望在这两种情况下看到7(我一直受到这样一个事实的指导:一元操作,在这种情况下递增,具有比二元操作更高的优先级)。有人可以在第一个例子中提供被忽略的i++的解释(或对解释的引用)吗?

3 个答案:

答案 0 :(得分:4)

++i增加i并返回i

i++会增加i并返回i值。

表达式从左到右进行评估,将运算符优先级考虑在内。

因此,在++i + i++中,当您从i == 2开始时,您会得到:++ii增加到3并返回3;然后i++i增加到4并返回3。最后,您i = 3 + 3 i成为6

请注意,这些是与实际编程无关的有趣技巧。

答案 1 :(得分:2)

  

有人可以在第一个例子中提供被忽略的i++的解释(或对解释的引用)吗?

i++是一个后增量;它递增i,但在递增之前计算为i的值。所以,例如:

int i = 3;
System.out.println(i++); // prints 3
// now, i == 4

换句话说,您可以将i++视为含义((i += 1) - 1)。所以,在你的例子中:

i = ++i + i++;

最后的i++并非完全忽略 - 它会增加i - 但会立即被分配取代。

答案 2 :(得分:1)

不会忽略增量;它是 postincrement 运算符(即在 i被引用后应用)。让我们来看看代码。

当你添加(++i + i++)时,它是从左到右完成的。这就是说,无论我有什么价值都是首先预先增量(因此它需要2到3),然后添加2. i已完成其引用,因此它将添加另外1,总共6。 / p>

在第二个示例中,当您添加(++i + ++i)时,i的值会预先增加两次,因此您会看到3 + 4