5

这种行为背后的逻辑是什么?

 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 :) 

任何人都可以对上述功能有所了解吗?

4

8 回答 8

12

看到这个精彩的答案:

x = x++;

相当于

int tmp = x;
x++;
x = tmp;

这个问题

于 2013-05-02T10:23:08.467 回答
6

i = i++是一个后缀增量运算符 - 它递增i,然后将其返回到其原始值(因为i++本质上“返回”了i递增之前的值。)

i = ++i会起作用,因为它是一个前缀增量运算符,并且会在增量后返回 I 的值。但是,您可能只想i++在第一次运行时不做任何额外分配 - 它(本质上)是i = i+1.

于 2013-05-02T10:21:46.970 回答
4

发生的事情是因为 java 是按值传递的。

在第一个循环中,i在语句中递增i++,然而,在第二个循环中发生的事情是i指向一个的内存位置,该位置存储的值i(在本例中为 0),然后递增旧位置。

可视化:

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

它将继续这样做,将旧值分配给新位置并为循环的每次传递增加旧值

于 2013-05-02T10:22:10.453 回答
2

i=i++;永远不会增加 i,因为 ++ 在 i=i 之后处理。

你可以这样看:

int i=0;
for(int k=0;k<10;k++){
    int j = 0;
    i = j;
    j = j + 1;
}
于 2013-05-02T10:22:33.763 回答
2
i = i++;

相当于,

int temp = i; // temp = 0
i++; // i=1
i = temp; // i = 0
于 2013-05-02T10:23:37.690 回答
1

++ 运算符在赋值处理,

如果你改变它,i=++i;你可能会得到你期望的行为

于 2013-05-02T10:22:24.733 回答
1

在第一个选项中,您使用 增加 i i++,这相当于i=i+1,因此它将 i 的值增加到 10。
但在第二个选项中,您正在分配 ia 新值,因此每次都获得相同的值。

于 2013-05-02T10:23:28.813 回答
1

我=我++;

返回 i 并递增。所以增量丢失了......看看这个伪代码

x = i++ 将在以下步骤中中断操作

x = i;
i++;

在您的情况下,它将 0 增量返回到 1(但增量丢失)

于 2013-05-02T10:24:02.067 回答