result is 1,not zero.
if i=i++; the result is 0;
because the operation direction is from left to right.

解决方案 »

  1.   

    i=0
    i=i++   
    i=0i=0
    i=++i
    i=1
      

  2.   

    服了你了!下回弄明白了再问嘛!同意楼上的兄弟:i=i++是先赋值再加1,i=++i是先加1后赋值。
      

  3.   

    i++先使用i再将i加一
    ++i相反
      

  4.   

    比如这样一个class:
    public class test {
    public static void main(String[] args) {
    int a = 5;
    a = a++;
    System.out.println(a);
    }
    }用javap来看看(编译后javap -c test):
    (略去前面一些与此关系不大的部分)
       0 iconst_5   // 常数5压入堆栈中
       1 istore_1   // 从堆栈中弹出赋值给索引为1的变量(这个时候a=5)
       2 iload_1    // *将后面那个a(索引为1的变量)的值压入堆栈中(为了以后的赋值)
       3 iinc 1 1   // 执行a++, 此时堆栈无任何变化!(这个时候a=6)
       6 istore_1   // 从堆栈中弹出赋值给a(这个时候a变成了5)   // 下面就不用看了, 呵呵 ... 
       7 getstatic #2 <Field java.io.PrintStream out>
      10 iload_1
      11 invokevirtual #3 <Method void println(int)>
      14 return值得注意的是上面打星号的那一行, 我想我还得举个例子来说明:
    事实上, a = a++中, 赋值给a永远都是最后一步, 而并非想象的a=a, 然后再a++ ... 为了描述上的方便, 做一下替换, 变成a=i++, 执行的过程如下:
    先把i压入堆栈中, 然后i++(i的值增加了1), 接着把i从堆栈中弹出赋给了a ...
    把这里的i换成a=a++中后面的那个a, 再结合上面javap提供的信息来看就应该能明白是怎么回事了, 呵呵 ...Good luck :)
      

  5.   

    真正的过程是这样的
    分为两部分
    evaluate 从左到右 i evalute 为0 然后 i++ evaluate 为0
    assignment从右往左 i= (i++ evaluate 出来的值 也就是 0) 
      

  6.   

    肯定呀!!i=i++表示将i的初始值赋0给i后,i自身再加1,所以print出来的是0而不是1,如果下次使用i这个变量时,它的值才会是1。
      

  7.   

    這樣肯定是0;
    因為i++是0
    所以i = i++後
    i是0
      

  8.   

    在Java 中表达式的运算次序在语言规范里已经定义好了,所有平台上的JVM都应该是一样的,不存在二义性。
    但是在C/C++中,由于ANSI C并没有规定必须遵守的运算次序,因此这个运算的结果要取决于编译器的具体实现了。