int i = 0;
i = i++;
System.out.println(i);
请问为什么结果是0,一道很基础的题目,为什么呢?搞不懂?

解决方案 »

  1.   

    i = i++;
    相当于int t = i;
    i++;
    i=t;
      

  2.   

    http://hi.baidu.com/freish/blog/item/aa947f8b42c4e118c9fc7a07.html
      

  3.   

    可是i自增了啊。变成1,打印出来的应该是1啊。2个i是同一个i对吗?
      

  4.   

    int i = 0;
    i = i++;//i++是先赋值,再增加 
    //如果写成这样
    int k=i++;//i的值应该才是1
    System.out.println(i);
      

  5.   

    说一下我自己的粗略理解,希望能帮到你。一点一点来。
    首先明确第一个问题:赋值运算的步骤。赋值运算符“=”的操作分为两个步骤,先取得等号右边的总体结果数值(假设记为temp),然后再将这个结果数值(temp)放到左边的接收量中去。
    然后再明确第二个问题:自增、自减运算符的先后问题。如果“++”在前面,那就是“先加加,再取加加之后的结果使用”;如果“++”在后面,那就是“先取得尚未加加的原来数值使用,然后这个量再加加”。
    这两个问题都非常的基础,一般人都懂,但是理解是否深刻就不一定了,所以就容易出现楼主这样的疑问。
    “i”原先的数值是0,然后执行语句“i = i++”,这个语句的作用和“i = i + 1”或者“i += 1”是完全不同的,实现机理不一样,所以结果也不一样。咱们具体来看:
    如果是“i = i + 1”,那么首先取得等号右边的结果数值(假设记为temp),也就是0和1的相加之和,将这个结果(也就是1)放到i这个变量中,所以i的内容就变成了1,覆盖了原来的0,这容易理解。
    但是对于“i = i++”来说,因为它是“后加加”,所以我们首先取到了i变量尚未加加之前的原来数值0来使用,让这个0作为等号右边的结果数值(即那个临时量temp)。在已经取得了等号右边的结果0之后,再执行后续加加步骤,i的数值就变成了0++ = 1。这时候,我们再继续执行“=”赋值操作,将刚刚取得到的等号右边的结果数值0(那个temp)放到等号左边的变量i当中,那么此时,虽然i已经因为“后加加”操作变成了1,却又因为“=”赋值操作现在重新变成了0。
    楼主提问,两个i是否是同一个i?我的回答是,确实是同一个i。这个i变量数值的变化是0 --> 1 --> 0。从0变成1,是因为在取得右侧结果数值之后的加加操作;又从1变成0,是因为再后来的“=”赋值操作。这里要特别注意,“后加加”操作是在“取值”操作之后,但却是在“赋值”操作之前的。
    关键不在于理解“=”与“++”的基本意思,而在于明白这个语句的每一个细微的步骤。
    我说的比较啰嗦,楼上很多高手应该都是这个意思,我来掰开揉碎而已,欢迎批评指导哦~
      

  6.   

    先把i的值0给i++,然后把i++的值给i
      

  7.   

    其实学术问题应该严谨些,在vs2010下,相同的c代码我执行结果是1,那其实就是说不同的编译器对表达式求值的顺序不一样,大家讨论下这个顺序问题吧
      

  8.   


          int i=0;
    012B351E  mov         dword ptr [i],0  
    i=i++;
    012B3525  mov         eax,dword ptr [i]  
    012B3528  mov         dword ptr [i],eax  
    012B352B  mov         ecx,dword ptr [i]  
    012B352E  add         ecx,1  
    012B3531  mov         dword ptr [i],ecx 环境vs2010
      

  9.   

    i = i++;
    这句话我是这么理解的
    首先执行 i = i 也就是i = 0;
    然后执行 i+1 但是这时候并没有把结果赋给左操作数(i),所以会打印出 0
      

  10.   

    我给的建议是,要学会自己测试,在你的程序里加几个println语句就可以了,如下所示:
    System.out.println(i);int i = 0;
    System.out.println(i);i = i++;
    System.out.println(i);
    看每一个输出的结果,当然第一个println如果前面没有定义i的话会报错,后面希望自己调试,我想学会调试程序才是真的学会了东西。
    希望对你有帮助
      

  11.   

    int i =0;
       i=i++;
       System.out.println(""+i);
    i=0
               int i =0;
       i++;
       System.out.println(""+i);
    i=1
      

  12.   

      其实这跟i++,++i关系不是很大,我分析是这样的
           int i=0;
           i++;       // i=1,i++=0
          i=0 ;    //因为i++=0
     SYso(i)     //为0
       就是赋值的先后
      

  13.   

    0---1-----0
    i=i++     先赋值 定义一个中间变量 int t=i  此时i是0 赋值t t=0  然后i++ i++之后i=1 可惜啊最后把t这个中间变量的值i=t   t是0嘛,结果i由1又变成了0  很衰啊,悲催的i++啊
      

  14.   

    楼主应先分清后加加 和前加加的区别 i=0,  t=i++这是先给t赋值; i 在加自增 1;运算后结果 t=0,i=1;
    i=0,t=++i; 是i 先自增 1 在赋值给t  运算后的结果是 i=1;t=1;
      

  15.   

    i=i++;   的执行过程是这样的,右边先执行,右边的运算结果为0,接着i自加,i=0+1=1,接着,右边的运算结果0再赋值给i,故i=0
      

  16.   


    你可以比较下
    int a=0,b=0;
    a = a++;
    b = ++ b
    一个是先赋值再自增;
    一个是先自增再赋值。
      

  17.   

    i++中涉及到两个值,一个是i的值,一个是表达式的值,++i同理
      

  18.   

    i++,会使i值+1,但i=又使i赋值回原来的0,这中间有一个临时变量t依然为0.
      

  19.   


    你可以比较下
    int a=0,b=0;
    a = a++;
    b = ++ b
    一个是先赋值再自增;
    一个是先自增再赋值。
      

  20.   

    int a=0;
    a=a++;
    System.out.println(a++);
    输出结果:1
      

  21.   

    这个问题解释权归oracle(sum)
    如果结果是0,则是13楼解释的理由,
    如果结果是1,则是20楼的理由。lz楼的表达式按日常使用习惯是不会出现的,所以什么理由都可以解释过去,其实它说你是语法问题也能解释一堆理由!
      

  22.   

    前自加和后自加的问题(自减也一样),如果是自加符号在前面,那么他就先把变量的值改变了然后再做操作(赋值也好还是输出或者运算),比如 int i=0;int j= ++i;那么他会先把i变量的值改变,也就是i变成了1,然后把改变后的值赋值给j,那么j就是1了,如果是j=i++,那么他会先把i原来的值赋给j,然后再把i变量自加,也就是j=0,i=1!这只是针对赋值操作,其他操作也是一样的!这就是个是先改变值还是先做操作的问题!胡乱瞎诌,不对的地方请指正!
      

  23.   

    遥想当年搞ACM的时候,写过个类似的函数func(xxx, i++),
    就一直记得这个问题了。囧。
      

  24.   

    你应该研究一下
    i = i++

    j = i++
    这两个运算之后i的值有什么区别i = i++;  i此时一定是0,英文在i还没改变之前又赋值给自身,所以相当于i = 0
    而 j = i++就没有这种影响,在下次调用i时i就自加成1了
      

  25.   

    你应该先研究下:
    i = i++;

    j = i++;
    看看这两个输出之后i有什么不同第一个在代码执行时i还没自加就赋值给自身了,所以相当于i=0,而第二个在代码执行后i才自加,所以下次调用i时i就自加成1了
      

  26.   

    学了很多年java了这个问题让我很蛋痛,真的不知道该怎么给你解释。
      

  27.   

    这个问题在java解惑里面写的很清楚 
    流程是
    temp=i i=i+1 i=temp
    但是注意了 在C++下(vc6.0)输出的是1没错 还有 这道题目根本不基础 不同语言会有不同输出 不要给一个变量在一个式子中赋值2次 完全没有必要而且会出意料之外的错误
      

  28.   

    i=i++;
    取出i
    让i加1
    再把刚才取到的值赋给i
      

  29.   

    可以试一下s = i++ + i++ + i++ ; 的结果,可能会让你有更深的感悟!!