i = i++;????

The code
int i = 0;i = i++;System.out.println(i);
produces the output "0" instead of "1". Why?



Let's take a close look at what the line "i = i++;" does:

 

  1. "i++" is evaluated. The value of "i++" is the value of i before the increment happens.
  2. As part of the evaluation of "i++", i is incremented by one. Now i has the value of 1;
  3. The assignment is executed. i is assigned the value of "i++", which is the value of i before the increment - that is, 0.

That is, "i = i++" roughly translates to

 

int oldValue = i; i = i + 1;i = oldValue; 

With other words, it is a common misconception that the increment is happening last. The increment is executed immediately when the expression gets evaluated, and the value before the increment is remembered for future use inside the same statement.

Solution:

You don't need the assignment at all, just use

 

i++;
 
-----------------------------------------------------------------------------------------------------

i++与++i的区别

如果是单独成行,两个没有本质区别(for循环中也是单独成行):++i; i++; 两个效果一样。只有当你和其

他运算联用的时候才有区别,比方赋值: x=i++ 和 x=++i是不一样的,区别自己用心理会。

例如:
i=6,x=0
x=i++ 就是先把i=6的值,赋值给x。然后i再++等于7,x=6。
x=++i 就是i先自己加1,然后再赋值给x。x和i都等于7。


把i++和++i语句分解如下:
++i 和 i++,在单独使用时,就是 i=i+1。
而 a = ++i,相当于 i=i+1; a = i;
而 a = i++,相当于 a = i; i=i+1;
所以---
a=++i完全可以写成 i++; a=i。
a=i++完全可以写成 a=i; i++。


简而言之---
++i 是先++在做后面的运算。
i++ 是先做后面的运算再加(运算完后i才++)。

++i 先自加再使用(用的时候已经是原值+1了);i++先使用再自加!

此上中文部分有待考虑。

最好的解释:

 学习过一门计算机语言的人一定知道j=i++的运算结果,整个表达式的值为i,而i的值变为i+1;那么i=i++又是一个什么情况呢?下面分别用java 和 c 两种语言来做个测试:
  
  JAVA:
  
  public class test
  
  {
  
  public static void main(String args[])
  
  {
  
  inti,j;
  
  i=0;
  
  for(j=0;j<5;j++)
  
  {
  
   i=i++;
  
  System.out.println("i="+i);
  
  }
  
  }
  
  }
  
  
  
  C:
  
  #include<stdio.h>
  
  main()
  
  {
  
   inti,j;
  
  i=0;
  
  for(j=0;j<5;j++)
  
  {
  
   i=i++;
  
  printf("i=%d/n",i);
  
  }
  
  }
  
  你也许会问,这么简单的程序会有什么问题呢?是的,如果不相信的话,你可以运行一下这两个程序,得到的结果非常让人震惊。
  
  第一个JAVA程序得出的结果如下:
  
  i=0
  
  i=0 www@bitscn@com
  
  i=0
  
  i=0
  
  i=0
  
  而第二个C程序得出的结果如下:
  
  i=1
  
  i=2
  
  i=3
  
  i=4
  
  i=5
  
  同样都是i=i++,为什么得出的结果会有这么大的差异呢?原来是在编译器上出了问题,java的编译器在遇到i++和i- -的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉,下面首先看一下如果是j=i++的情况:


  
 

  i的原始值存放在后开辟的内存中,最后这个值将赋值给j,这样j=i++后,j就会得到i的值,而i又将自加,所以,在释放内存之后,原来存放j和i的地方将得到值将是:j(此时的值等于初始i值)和i(i自加后的值)。
  
  明白了上面的问题,让我们接下来看看i=i++的情况:
  


  所以这样最后一次循环内的结果仍旧是i(即0)。
  
  而C语言中的i=i++就只是完成i++的内容,所以结论会不同。这种情况说明java和c的处理语法的机制不同,如果在程序中只输入i++就不会出现这个方面的问题,所以大家在以后的程序中如果使用到i=i++的时候要格外小心,一般只需要用i++就不会有问题了。 【转自www.bitsCN.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值