int m = 0;
m += m++;
System.out.println(m);
打印到,0
但我认为m
会发布增量,最后是1
。有人请解释一下。
注意:我知道后增量是如何工作的(至少我认为我知道:P)。但我想弄清楚的是,当我说m + = m++
让我们假设它意味着在发送 的值之后m = m + m++
评估,在这种情况下,然后评估然后增加 的值,因为后增量。现在如果发生了后增量,为什么没有m++
m
0
m = 0 + 0
m
m
1
int m = 0;
m += m++;
System.out.println(m);
打印到,0
但我认为m
会发布增量,最后是1
。有人请解释一下。
注意:我知道后增量是如何工作的(至少我认为我知道:P)。但我想弄清楚的是,当我说m + = m++
让我们假设它意味着在发送 的值之后m = m + m++
评估,在这种情况下,然后评估然后增加 的值,因为后增量。现在如果发生了后增量,为什么没有m++
m
0
m = 0 + 0
m
m
1
考虑以下规则:
a += b
相当于a = a + b
。因此m += m++
等价于m = m + m++
。
您可以看到,第一次出现的m
at the right vision 在增量之前被评估并产生0
m++
递增并返回递增前的m
原始值。
所以,在你的情况下设置并返回m
m++
m
1
0
赋值发生在评估右侧之后,而后增量发生在评估右侧期间。
现在您可以看到您的表达式的评估如下:
右侧的评估产生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();
}
}