【发布时间】:2010-03-04 05:47:31
【问题描述】:
谁能解释一下为什么会这样
int i=0;
i=i++;
i=i++;
i=i++;
System.out.println(i);
它打印为零。
【问题讨论】:
标签: java
谁能解释一下为什么会这样
int i=0;
i=i++;
i=i++;
i=i++;
System.out.println(i);
它打印为零。
【问题讨论】:
标签: java
i++ 是一个后增量 (JLS 15.14.2)。它递增i,但表达式的结果是i 的值之前 递增。将此值重新分配给i 实际上使i 的值保持不变。
这样分解:
int i = 0;
int j = i++;
很容易看出为什么j == 0 在这种情况下。现在,我们用i 替换左侧而不是j。右手边的值仍然是0,这就是为什么你会在你的sn-p中得到i == 0。
【讨论】:
你的本意是这样做的:
int i = 0;
i++;
i++;
i++;
System.out.println(i);
i++ 实际上做了一个分配,所以如果你添加一个= 你只会混淆事情。这些其他优秀的响应者可以为您提供细节,其中一些细节让我无法理解。 :)
【讨论】:
首先你不应该写这种代码......
但是,如果我们考虑问题,那么这很简单:它与后缀运算符“返回”值的方式有关。后缀优先于赋值运算符,但后缀运算符在增加 i 的值后返回 i 的前一个值。所以我再次被分配到它之前的值。
再一次不要在你的代码中使用这个结构,因为下一个看到这个结构的程序员会追上你(手里拿着大东西):)
【讨论】:
让I=++ 增加,A=i 分配。它们是不可交换的:IA != AI。
总结
IA = "first increase then assignment"
AI="first assignment then increase"
反例
$ javac Increment.java
$ java Increment
3
$ cat Increment.java
import java.util.*;
import java.io.*;
public class Increment {
public static void main(String[] args) {
int i=0;
i=++i;
i=++i;
i=++i;
System.out.println(i);
}
}
相关
【讨论】: