1

为什么下面的代码

int i = 1; 
System.out.print(i += i++);
System.out.print(i);

第二次打印输出 2两次而不是 3?

有人可以解释一下吗?

谢谢。

4

5 回答 5

4

如果您意识到 a++ 的工作方式如下(伪代码):

func ++(ref a)
{
    int b=a;
    a=a+1;
    return b;
}

那么这一切都说得通了。

于 2010-01-17T13:00:32.310 回答
3

看起来我最终应该是 3 岁。

但是,如果您更仔细地查看该声明

i += (i++)

等于

i = ( i + (i++) ) 

在这种情况下,即 1+1。

i++ 的副作用是 i=i+1=1+1=2 如您所料,但是 i 的值在赋值后被覆盖。

于 2010-01-17T13:06:36.633 回答
2

我还不太了解 Java 字节码语法,但根据我在字节码级别的说法,您的代码看起来像这样:

int i = 1;  // iconst_1:    variables { }, stack {1}
            // istore_1:    variables {1}, stack { }
i += i++;   // iload_1:     variables {1}, stack {1}
            // iinc 1, 1:   variables {2}, stack {1}
            // iadd:        variables {2}, stack {2} ...Note that here 1 gets added to the value on stack
            // istore_1:    variables {2}, stack {2} ...Here the variable value will overwrite the stack value

我认为这解释了你得到很好的输出。:-)

各位高手,如有错误请指正...

于 2010-01-17T13:31:30.020 回答
2

我不认为这是不知道后缀一元运算符(expr ++)如何工作的问题。造成混乱的是评估语句的顺序。

int i = 1;
System.out.println(i += i++); // Output: 2

所以最后一条语句与下面两条语句的顺序相同:

i++; // i is now 2 for the rest of this statement and the program
i = 1 + 1; // i is assigned again  

所以后缀运算符首先被评估,然后整行被评估,但使用 i 的前一个值。

因此,使用另一个可以更清楚地说明这一点的示例:

int i = 2;
System.out.println(i += i++); // Output: 4
System.out.println(i); // Output: 4  

另一个例子:

int i = 2;
System.out.println(i = i + i++ + i--); // Output: 7
System.out.println(i); // Output: 7  

第二行是分配i。第一个i是 2,下一个i也是 2,但现在第三个i是 3,因为i++改变了i的值。与之前的情况一样,i--不会对 i 产生任何影响,因为它将被重写为i = 2 + 2 + 3

int i = 1;
System.out.println(i = i++ + i); // Output: 3
System.out.println(i); // Output: 3
于 2010-01-17T16:23:19.567 回答
-1
1 + 1 == 2. 

所以:

i + i == 2  

i += i == 2

接着

i += i++ == 2

很直接。

于 2010-01-17T13:19:35.197 回答