int m = 0;
m += m++;
System.out.println(m);
打印到,0
但我认为m会发布增量,最后是1。有人请解释一下。
注意:我知道后增量是如何工作的(至少我认为我知道:P)。但我想弄清楚的是,当我说m + = m++让我们假设它意味着在发送 的值之后m = m + m++评估,在这种情况下,然后评估然后增加 的值,因为后增量。现在如果发生了后增量,为什么没有m++m0m = 0 + 0mm1
int m = 0;
m += m++;
System.out.println(m);
打印到,0
但我认为m会发布增量,最后是1。有人请解释一下。
注意:我知道后增量是如何工作的(至少我认为我知道:P)。但我想弄清楚的是,当我说m + = m++让我们假设它意味着在发送 的值之后m = m + m++评估,在这种情况下,然后评估然后增加 的值,因为后增量。现在如果发生了后增量,为什么没有m++m0m = 0 + 0mm1
考虑以下规则:
a += b相当于a = a + b。因此m += m++等价于m = m + m++。
您可以看到,第一次出现的mat the right vision 在增量之前被评估并产生0
m++递增并返回递增前的m原始值。
所以,在你的情况下设置并返回mm++m10
赋值发生在评估右侧之后,而后增量发生在评估右侧期间。
现在您可以看到您的表达式的评估如下:
右侧的评估产生0并设置m为1
赋值设置m为右侧 ( 0)的值
事件的顺序是:
即这相当于:
tmp = m;
m++;
m = tmp;
如果你做了 m = ++m,那么序列将是:
回答:作业在执行作业之前评估副作用。
m += m++;
相当于
temp = m + m++; ; m is now 1, but temp is 0
m = temp; ; m is now 0 again
int m = 0
此时 m 为0
m += m++;
扩展到m=m+(m++)
m返回0
m++返回 m 的值,0然后将其递增到1
转变m+(m++)为0+0(m 是1这一点)
然后将其分配给m最终值m.
提示:当您触摸该值时避免后增量,否则
在您的代码中
m+ =m++;结果 -- >> M 值 + (增加后的 m 值(m++))
最初
m值= 0
后递增 (m++) m 值 = 0 (前递增 (++m) = 1)
嗯 m++ 返回 m 之前的值以递增它,与 ++m 递增然后返回相反,如:
int m++(int m){
int tmp = m;
m = m+1;
return tmp;
}
int ++m(int m){
m = m+1;
return m;
}
f是你的代码。g是一个扩展版本,显示了为什么它们都打印0。
class Test {
private static void f() {
int x = 0;
x += x++;
System.out.println(x);
}
private static void g() {
int x = 0;
int preInc = x; // preInc = 0
x += 1; // x = 1
x = preInc; // x = 0
System.out.println(x);
}
public static void main(String[] args) {
f();
g();
}
}