程序是这样的
class Tang
{
   public static void main(String []args)
   {
int i=11,j=0;
         i=i++;
       System.out.println("i1="+i);
       System.out.println("i2="+i);
   }
}
结果是i1=11;i2=11;
我认为的结果是i1=12,i2=12;
我是这样理解的,当执行i=i++时,首先把右边的i赋给左边i,然后在执行左边的i++;所以我认为结果是2个都12;
请高手指教一下为什么结果2个都是11呢,

解决方案 »

  1.   

    当然都是11了,这个问题前不久有人问过.
    在c里面这种计算结果是不确定的!
    但是java中是确定的
      

  2.   

    不是内存的问题,主要问题出在
    i=i++;
    这条语句上,仔细看看java基础吧。
    i++是在本条语句执行完后,才会去加1的,当给i赋值的时候他仍然是11。
      

  3.   

    i=i++; Eclipse里这句话有个警告,The assignment to variable i has no effect
    断点调试也不执行这个语句。
    可见编译器根本没有编译这句话。
      

  4.   

    code maybe this:
    class Tang
    {
       public static void main(String[] args)
       {
        int i1=11,j=0;
        int i2=i1++;
        System.out.println("i1="+i);
        System.out.println("i2="+i);
       }
    }
      

  5.   

    What happens is that the initial value of x is stored in a temporary register, then x is incremented, then the value stored in the register is asigned to the left hand side of the expression, in this case the LHS is x so x gets its original value. 
    int x = 1; 
    x = x++; 
    Steps: 
    1 initial value of x is stored in temp register. So temp = 1. 
    2 x is incremented. x = 2 and temp = 1. 
    3 the value of the temp register is assigned to the LHS. x = 1
      

  6.   

    好,经典,我弄明白了...其实这题不是++操作符的问题,而是赋值表达式的问题....关键在于赋值,不是将右边变量的值赋予左边
    而是将=号右边的"整个表达式"的值赋予=号左边的变量那么回到此题:
    i=i++=号的右边:(i++)是一个表达式
    因为++是后缀,所以,先得到表达式的值0,
    然后在对i变量进行++操作,可是不管i变量如何改变,表达式的值都已经确定了
    也就是说,i++这个表达式的值是0,i这个变量的值是1那么,也就很清楚了
    i=(i++)
    也就相当于:
    i=0
      

  7.   

    Helloooooo(每天,我都新的)
    的说法很经典,受益匪浅i=i++
    也就相当于顺序执行:temp=i++;
    i=temp;
      

  8.   

    现学现卖,考考大家
    class Test{    public static void main(String []args)
       {
       int a1=1;
       int a2=1;
       int a3=1;
       int a4=1;
             int i1=(a1++)+(a1++)+(a1++);
             int i2=a2+++a2+++a2++;
             int i3=a3+++a4++;
             
           System.out.println("i1="+i1);
           System.out.println("i2="+i2);
           System.out.println("i3="+i3);
       }
    }i1,i2,i3分别是多少?
      

  9.   

    从语言层面上说,C/C++里,i = i++;这样的句子由于运算的优先级问题,i总能得出一个正确的结果:i=i+1;(作为单一句式来说,i=i++;i = ++i;i++;++i;四种结果相同,即都该为12),但在Java中,对这类问题,编译器为避免歧义,往往会略过不加处理(我认为这是Java语言的BUG,因为从语法分析上,无论是先加还是后加,其最终都该存在加一过程,由于Java采用的数据引用机制,中间可能会添加临时的参数,最终导致数理混乱,以至于干脆跳过不编译处理,而将其作为i=i;处理),在Java中,为了保证逻辑安全,应尽量避免使用这类句式,而多采用多行的复制语句。再说,多写几行代码,能多算劳动量,多结银子何乐而不为呢?
      

  10.   

    搞不清楚就不用啊,又不是什么无法避免的写法. ++操作不和赋值操作一起用,无论你是在C还是JAVA就都不会有问题,一定要用,就自己作个试验,记住结果就行.
      

  11.   

    这个问题已经讨论过了 关键在于i=i++;
    当java执行的时候对于i++是执行先将i的值存储到寄存器,然后将i自动加1,寄存器里面的值用于运算(将寄存器里面的值赋值给i)这样 i=i++ 的结果就是以前的值,不会改变。