这种行为背后的逻辑是什么?
int i=0;
for(int k=0;k<10;k++){
i++;
}
System.out.println("i="+i);
Output=10; //Exepcted
int i=0;
for(int k=0;k<10;k++){
i=i++;
}
System.out.println("i="+i);
Output=0; //Surprised :)
Run Code Online (Sandbox Code Playgroud)
任何人都可以对上述功能有所了解吗?
看到这个精彩的答案:
x = x++;
Run Code Online (Sandbox Code Playgroud)
相当于
int tmp = x;
x++;
x = tmp;
Run Code Online (Sandbox Code Playgroud)
从这个问题.
i = i++是一个后缀增量运算符 - 它递增i,然后将其返回到其原始值(因为它i++基本上"返回" i它增加之前的值.)
i = ++i会工作,因为它是一个前缀增量运算符,并会在增量后返回I的值.但是,您可能只想i++在没有任何额外任务的情况下执行此操作,就像您在第一次运行中所做的那样 - 它(基本上)就像它的速度一样i = i+1.
之所以发生这种情况,是因为 java 是按值传递的。
在第一个循环中,在语句i中递增i++,但是,在第二个循环中,发生的情况是i指向存储值(在本例中为 0)的新i内存位置,然后递增旧位置。
可视化:
i => 0x00000001 // 0
for() {
i => 0x00000002 <- 0 // store old i value (0) in new location
0x00000001++ // Increment the value stored at the old location
// Cause there is no longer a reference to 0x00000001,
// it will get garbage collected and you will be left with
// i => 0x00000002
Run Code Online (Sandbox Code Playgroud)
它将继续这样做,将旧值分配给新位置并为循环的每次传递增加旧值
| 归档时间: |
|
| 查看次数: |
6700 次 |
| 最近记录: |