int i = 0, j = 0;
i = i++;
System.out.println(i);
j = i++;
System.out.println(i);
结果是0 1很费解为什么
总是不明白。。
为什么不是1和2??
希望能有人给我讲明白下。。
我是新手

解决方案 »

  1.   

    i++ 与++i的问题
    i++:先引用后自加
    ++i:先自加后引用int i = 0, j = 0; 
    i = i++;   //换成i=++i 试下
    System.out.println(i); 
    此时 i=0  j = i++; 
    System.out.println(i); 
    这时候i已经自加过了 
    i=1 
    System.out.println(i); 
      

  2.   

    int i = 0, j = 0; 
    i++; //这样会打印1,2
    System.out.println(i); 
    j = i++; 
    System.out.println(i); 
    //这个问题问得不错
    //java的编译器在遇到i++和i--的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉
      

  3.   

    我觉得这样解释,你就能明白是怎么回事儿了:        int i = 0, j = 0, k = 0;
            k = i++;
            i = k;
            System.out.println(i); 
            j = i++; 
            System.out.println(i); 
      

  4.   

    ++在i前面 是先使用i再自加1
    那么i=i++ 就是把i=0 先赋值给了i 然后i自加了1之后就变成1了
    j=i++ 同样是把i=1的值先给了j 然后i自加1变成了2
      

  5.   

    lz的代码如果对应地翻译成C++代码,输出的结果就会如你所愿。:)
    为了详细解释你的困惑,我觉得还是要首先了解++的用途。它的出现是为了简化下面这样的语句:
    i = i + 1;
    简化为:
    i++;      // i值先参与运算,然后再加1
    或者:
    ++i;      // i值先加1,然后再参与运算
    如果单独写为一行,i++;和++i;是一样的,因为除加1外,没有需要参与的其他运算。既然是++的用途是如上所说,那么:
    i = i++; 
    这样的用法就很不合适了,而且可能会发生混乱,要尽量避免,也就是说,在使用++这样的运算符的时候,等号左边的变量名和等号右边的变量名不能是一样的,你要么写成:
    i++;
    要么写成:
    i = i + 1;
    而不能写成:
    i = i++;
    因为,先左边的i等于右边的i(开始为0),然后右边的i加1,做完这行的运算后,i到底是0还是1呢?不同的编程语言是不太一样的,在java中i = i++;运行完成后,i的值仍然为0,直到它参与运算完下一次运算后,再加1。(C++则不同,请看后面的C++代码)。所以,这样的写法最好杜绝。如果你的代码改写成:
    public static void main(String[] args)
    {
    int i = 0;
    //int j = 0; 
    //i = i++; 
    System.out.println(i++);          (1)
    //j = i++; 
    System.out.println(i++);          (2)
    }
    就更符合++这个符号的要求。同时也更好解释为什么输出结果为0和1了:
    在(1)中,i首先等于0这个值参与println运算,因此输出0,然后i加1,此时i等于1了;
    在(2)中,i首先等于1这个值参与println运算,因此输出1,然后i加1,此时i等于2了。如果你的代码再改写成:
    public static void main(String[] args)
    {
    int i = 0;
    int j = 0; 
            int k = 0;
    k = i++; 
    System.out.println(i);          (3)
    j = i++; 
    System.out.println(i);          (4)
    }
    那么输出结果就是:
    1
    2
    上面代码中,我只加了另外一个int变量k,而且是用
    k = i++;
    来代替:
    i = i++;
    这样就一切变得很好解释了。所以,最好不要写成: i = i++; 这样的形式,写成k = i++; 尽管不是很优雅,但语义上还是很容易解释的。
    把你的Java代码翻译为C++代码如下:
    #include <iostream>
    using namespace std;
    int main(void)
    {
    int i = 0, j = 0; 
    i = i++;                           (5)
    cout << i << endl; j = i++; 
    cout << i << endl;                 (6) return 0;
    }
    输出结果是:
    1
    2解释:
    前面说道C++和Java对于++运算符处理的不同。在上面C++代码(5)中,先左边的i等于右边的i(开始为0),然后右边的i加1,做完这行的运算后,i到底是0还是1呢?不同的编程语言是不太一样的,在C++中i = i++;运行完成后,i的值将为1。后面输出2的情形就不用再解释了吧。总结一下:
    a. 尽量不要象i = i++;使用++运算符;
    b. 如果非要那样写,必须注意在不同的语言中,加1的运算所发生的时间点是不同的:
       在Java中,i = i++; 的加1操作是在该语句执行完成后,并且在下一个操作完成后才进行的;
       在C++中,i = i++; 的加1操作是在该语句执行完成后就进行了。希望上面的文字解决了你的困惑。
      

  6.   

    其实这是++i和i++的问题:
    例:
    int i=0;
    a=++i,得到的结果是先把i加1,即i=i+1,这时i=1,然后将值赋给a,最终a=1;
    b=i++,得到的结果是先把i的值赋给b,这时i=0,即b=0,然后将i加1,但不影响b的值,最终b=0