int i = 0;
 i = i++;
 System.out.println(i);
 
 输出: 0
 
 问题:执行i=i++;这句后,左i=0,右i=1,那编译器怎样决定输出的是哪个i? 还是我这样理解有错误?请教大家了!

解决方案 »

  1.   

    这个赋值操作等价于下面的语
    句序列:
    int tmp = i;
    i = i + 1;
    i = tmp;
    建议:
    不要在单个的表达式中对相同的变量赋值超过一次。
    对相同的变量进行多次赋值的表达式会产生混淆,并且很少能够产生你希望的行
    为。
    java解惑的内容,楼主可以去找找这本书
      

  2.   

    i=i++;
    左i=0,右i=0
    i=++i;后
    两边都是1了
      

  3.   

    i++的问题是先返回i,然后在i+1
      

  4.   


       0: iconst_0  //把常数0入栈
       1: istore_1  //本地常量赋值  0出栈
       2: iload_1   //加载本地变量值   0又被入栈
       3: iinc 1, 1 //本地变量自加1,但是不会入栈    
       6: istore_1 //0出栈赋给0
       7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
       10: iload_1   //加载本地变量值 为0
       11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
       14: return
      

  5.   

    i=i++表达式的值是i,然后i自增,再然后表达式的值又赋回给i
      

  6.   

    学院派的人就特喜欢把这种问题拿出来显摆,而其实这种题没有任何实质性的意义。这种问题在C、C++、C#、Java 中测试,可能会出现不同的结果。而其实程序员只需要知道++符号放在变量的前面和后面有哪些区别即可。
    楼主的这种写法对程序效率方面起不到任何作用,相反会降低程序的可读性。如果我手下的程序员出现这种写法,我会立即叫他改过来,否则请你另谋高就
      

  7.   

    i=i++;//是先赋值,然后再加1
    i=++i;//是先加了1再赋值
      

  8.   

    理解确实有误,只有一个i,首先执行右边的,i变成1,但是i++还是0,再执行左边的,把0赋给i,i又变成0了。所以打印出来是0!
      

  9.   

    i=i++;先赋值,再i自增1 
    i=++i;先自增1,再赋值楼主那样的写法确实没有多大的可读性
      

  10.   

    没什么好争的。这是java的机制决定的。
    就如同:String a="aa";
    String b=a;
    a="dddddddd";把a输出:a="dddddddd"
    把b输出:b="aa"。但是C语言输出是
    把a输出:a="dddddddd"
    把b输出:b="dddddddd"。道理基本一样。
    如果把java的机制的机制改变了,肯定也可以
    i=0;
    i=i++;
    这是i肯定也是1
      

  11.   

    真正的程序肯定不会这样写的,只是有点想不明白所以提出了,不是要显摆什么的。
    另外,这是SUN公司2006年10月的一道面试题
      

  12.   

       这个问题其实很简单···i++ 是先赋值后自加1,而++i是先自加1然后把所得的值赋给变量。···不知道这样讲lz有没有明白···
      

  13.   

    i++={
    int temp=i;
    i=i+1;
    return temp;
    }
      

  14.   

    i=i++;//是先赋值,然后再加1 
    i=++i;//是先加了1再赋值还不明白,就没办法啦~
      

  15.   

    i++是先操作后赋值,而++i就是先赋值后操作,如果你刚才改为i=++i的话,那值就是为1了!!
      

  16.   

    刚才说的操作是说程序运行System.out.println()的操作哦!!大家别误会成是+1哦