2013-05-02 116 views
4

这种行为背后的逻辑是什么?i和i = i ++ in for循环java

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

任何人都可以抛出上述功能吗?

+0

是什么?这是相同的代码 – Axarydax 2013-05-02 10:21:20

+0

@Axarydax第二个版本有'i = i ++'而不是'i ++' – Rup 2013-05-02 10:21:40

+0

http://stackoverflow.com/questions/7911776/what-is-x-after-xx – NINCOMPOOP 2013-05-02 10:21:45

回答

8

看到这个精彩的回答:

x = x++; 

相当于

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

this question

6

i = i++是后缀增量操作 - 它增加i,则返回其原始值(因为i++基本上是“回报”的i值,然后才递增)

i = ++i会的工作,因为它是一个前缀增量运算符,并在增量后返回I的值。但是,您可能只想在那里执行i++,而无需像第一次运行那样进行额外的分配 - 它(本质上)简写为i = i+1

3

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

在第一循环中,ii++声明中得到增加,但是,在第二循环中正在发生的事情是,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 

而且它将继续这样做,指定旧值到一个新的位置和

1

++运算符被处理每个循环过程递增旧值的分配新建分配FY后,

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

+0

好吧。但是你不应该推荐一个不好的解决方案。更好的解决方案是'i ++;'或'i + = 1;'或'i = i + 1;'。 – 2013-05-02 11:15:00

+0

yes agree,'i = ++ i;'would never be used in practice – paul 2013-05-02 11:18:05

2

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

你可以看到这样的:

int i=0; 
for(int k=0;k<10;k++){ 
    int j = 0; 
    i = j; 
    j = j + 1; 
} 
1

在第一选项中,则通过使用i++,这相当于i=i+1递增I,所以它增加的i的值10
但在第二选项,则assining IA新值,因此每次获得相同的价值。

2
i = i++; 

相当于,

int temp = i; // temp = 0 
i++; // i=1 
i = temp; // i = 0 
1

I = I ++;

返回i并增加。所以增量输了...看看这个伪代码

X = I +将打破在下面的步骤

x = i; 
i++; 

在你的情况下操作,则返回0增量为1(但是增量丢失)

相关问题