以下是输出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)
方法3
和3
汇总后,i
变为4
(由于i++
),但在左侧部分i
采用汇总的6
值。
但是如果方法改为以下,我们得到7
:
static void m(int i) {
i = ++i + ++i;
System.out.println(i);
}
但我希望在这两种情况下看到7
(我一直受到这样一个事实的指导:一元操作,在这种情况下递增,具有比二元操作更高的优先级)。有人可以在第一个例子中提供被忽略的i++
的解释(或对解释的引用)吗?
答案 0 :(得分:4)
++i
增加i
并返回新值i
。
i++
会增加i
并返回i
的旧值。
表达式从左到右进行评估,将运算符优先级考虑在内。
因此,在++i + i++
中,当您从i == 2
开始时,您会得到:++i
,i
增加到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
。