为什么下面的代码
int i = 1;
System.out.print(i += i++);
System.out.print(i);
第二次打印输出 2两次而不是 3?
有人可以解释一下吗?
谢谢。
为什么下面的代码
int i = 1;
System.out.print(i += i++);
System.out.print(i);
第二次打印输出 2两次而不是 3?
有人可以解释一下吗?
谢谢。
如果您意识到 a++ 的工作方式如下(伪代码):
func ++(ref a)
{
int b=a;
a=a+1;
return b;
}
那么这一切都说得通了。
看起来我最终应该是 3 岁。
但是,如果您更仔细地查看该声明
i += (i++)
等于
i = ( i + (i++) )
在这种情况下,即 1+1。
i++ 的副作用是 i=i+1=1+1=2 如您所料,但是 i 的值在赋值后被覆盖。
我还不太了解 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
我认为这解释了你得到很好的输出。:-)
各位高手,如有错误请指正...
我不认为这是不知道后缀一元运算符(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
1 + 1 == 2.
所以:
i + i == 2
和
i += i == 2
接着
i += i++ == 2
很直接。