int i = 1;

i = i++;

System.out.println(i);输入为什么是1

解决方案 »

  1.   

    怎么又是这问题?i=i++;先执行++运算符,i的值的2.
    求(i++)这个表达式的值,是执行++之前i的值1.
    再赋值.这样的表达有什么意义吗?包含i++,i--,++i,--i之一的表达中就不要再出现另一个i了,完全没有必要找麻烦。
      

  2.   

    楼主可以打印一下
    System.out.println(i++); 结果是1吧那当然你再赋值给i,i就是1啦
      

  3.   

    告诉楼主一个简单的方法 以后就不犯错了int i = 1; 
          int j; j = i++; System.out.println(j);
      

  4.   

    i++ i=2 返回值1
    i=i++的返回值
      

  5.   

    你们看清楚,我问的是i=i++不是什么 j=i++还有我问的 为什么为什么为什么为什么打印出来的是 1!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~而不是2
      

  6.   


    那么i=i++ 这一行的 两个i 与前边的变量定义有什么关系
      

  7.   

    i=i++;//先赋值后++
    i=++i;//先++后赋值
      

  8.   

    应该从操作符优先级作分析
    ++优先于=i=1;
    i = (i++);
    i++返回的结果是1 i++把i的值改成了2 之后把i++返回的结果1赋值给i 
    所以 i=1;
      

  9.   

    i++  先引用再赋值;
    ++i  先赋值再引用.     int i = 1; i = i++; System.out.println(i);   //这个地方先引用i的值,输出自然是1了,如果是 ++i,才输出2
      

  10.   

    看我5楼的代码了没 那个i=i++ 左边的i你可以换成别的变量 这样你就不会被蒙蔽了
      

  11.   

    哎 我对你无语了 帮你理解 你还i=1, i++ =1  然后把1赋值给j  打印出来  还是1   你要管中间那么多干啥???还废话???
      

  12.   

    哦,我来帮助楼主理解下8,我有些明白了
    i=i++步骤如下:
    1.先做(i++),先取出引用为1,然后进行自增运算i=2;
    2.然后i=i,因为使用先前的引用,所以把2又变回了1;
    3.打印出来了1
    不知道这种理解是否正确??
      

  13.   

    其实说白了 就是运算符的优先级 我和lovecj6185只是把中间过程省略了  没想到遭到lz的白眼...
      

  14.   


    不是我要管那么多
    你们想想,学了这么久计算机,都学了什么,哪本书不是带你深入的剖析里面的原理?
    当然有一点,一门语言,不管是JAVA C++还是 C#的那个语法规范还是什么东西,JAVA的有600多页,这东西咱们看不到也学不到,我没事就喜欢研究一些个小的,但是看起来有意思的东西说错话的地方,请多谅解
      

  15.   

    楼主你也先好好看看楼上朋友们的回帖,看看别人说的是否有道理
    那楼上有几位也是有星的,在java版也是有一定权威的怎莫就你一个人研究原理,难道说大家都不懂?其实偶还在担心另一个问题
    如果偶的项目组里有楼主这样的,该如何是好
    呵呵
      

  16.   

    我也同意应该打印的是   2
    i=i++就我所学和理解
    相当于 i=i;
    i++;
    System.out.println(i);出来的自然是2
      

  17.   

    首先看运算符优先级,i++ 先做 , i自增值为2接着看表达式的返回值,i++这个表达式的运算结果是i之前的值1最后轮到等号运算符,  i = (i++表达式的值) 
      

  18.   

    这是java的bug,其实结果应该是2,贴一下汇编代码    int i = 1;
    0041183E  mov         dword ptr [i],1  // 给 i 赋值, i 为 1
        i = i++; // 分解为 i = i; i++;
    00411845  mov         eax,dword ptr [i] // 把 i 的值放到 寄存器 eax 中,eax 为 1, i = i 第 1 步
    00411848  mov         dword ptr [i],eax // 把 寄存器 eax 中的值赋值给 i, i 为 1, i = i 第 2 步
    0041184B  mov         ecx,dword ptr [i] // 把 i 的值放到 寄存器 eax 中,eax 为 1, i++ 第 1 步
    0041184E  add         ecx,1 // 把 寄存器 eax 中的值加上 1, eax 为 2, i++ 第 2 步
    00411851  mov         dword ptr [i],ecx // 把 寄存器 eax 中的值赋值给 i,i 为 2, i++ 第 3 步
    LZ死心了吧?
      

  19.   

    找到正解了,是处理机制不同,遇到这种有歧义的语句还是绕道吧……
    http://java.chinaitlab.com/base/21363.html
      

  20.   

    http://blog.csdn.net/ZangXT/archive/2008/11/05/3229281.aspx
      

  21.   

    如果是这样,明明就是VC++的Bug.
    同一个值赋给不同的变量结果要不同才正确???
      

  22.   


    就算赋值给其他变量 i还是等于 2j = i++;
    同样是分解成 j = i; 和 i++;
      

  23.   

    其实很多人都错误的理解楼主的意思了。
    我同意用汇编来解释,但很烦。
     
    其实可以这样看的:
    i(1)=i(2)++;
     我先它们编了个号;
    当(2)号i自加前会把1付给(1)号i;
    然后即会马上执行打印为“1”;
    其实还没来得及i自加变成2呢。其实这涉及到线程的问题。