int a=0;
for(int i=0;i<10;i++)
a=a++;
System.out.println(a);
为什么a是0
其中什么原理如果这样
                  int a=0;
                int b=0
for(int i=0;i<10;i++)
b=a++;
System.out.println(b);
为什么b却可以取得到a累加的值。

解决方案 »

  1.   

    a=a++; //先给a赋值为0 再把a+1, 再循环a还是0
    b=a++; //先给b赋值为0 再把a+1, 再循环时a已经变成1了
      

  2.   

    0  aload_0 [this]
        1  invokespecial java.lang.Object() [8]
        4  return
          Line numbers:
            [pc: 0, line: 5]
            [pc: 4, line: 7]
          Local variable table:
            [pc: 0, pc: 5] local: this index: 0 type: com.wang.test.Test
      
      // Method descriptor #15 ([Ljava/lang/String;)V
      // Stack: 2, Locals: 3
      public static void main(java.lang.String[] args);
         0  iconst_0
         1  istore_1 [a]
         2  iconst_0
         3  istore_2 [i]
         4  goto 15
         7  iload_1 [a]
         8  iinc 1 1 [a]
        11  istore_1 [a]
        12  iinc 2 1 [i]
        15  iload_2 [i]
        16  bipush 10
        18  if_icmple 7
        21  getstatic java.lang.System.out : java.io.PrintStream [16]
        24  iload_1 [a]
      

  3.   

    你把第一段代码里的a=a++改成a++就能循环累加了
      

  4.   

    刚才的没有加完从新加
    // Compiled from Test.java (version 1.5 : 49.0, super bit)
    public class com.wang.test.Test {
      
      // Method descriptor #6 ()V
      // Stack: 1, Locals: 1
      public Test();
        0  aload_0 [this]
        1  invokespecial java.lang.Object() [8]
        4  return
          Line numbers:
            [pc: 0, line: 5]
            [pc: 4, line: 7]
          Local variable table:
            [pc: 0, pc: 5] local: this index: 0 type: com.wang.test.Test
      
      // Method descriptor #15 ([Ljava/lang/String;)V
      // Stack: 2, Locals: 3
      public static void main(java.lang.String[] args);
         0  iconst_0
         1  istore_1 [a]
         2  iconst_0
         3  istore_2 [i]
         4  goto 15
         7  iload_1 [a]
         8  iinc 1 1 [a]
        11  istore_1 [a]
        12  iinc 2 1 [i]
        15  iload_2 [i]
        16  bipush 10
        18  if_icmplt 7
        21  getstatic java.lang.System.out : java.io.PrintStream [16]
        24  iload_1 [a]
        25  invokevirtual java.io.PrintStream.println(int) : void [22]
        28  return
          Line numbers:
            [pc: 0, line: 13]
            [pc: 2, line: 14]
            [pc: 7, line: 15]
            [pc: 12, line: 14]
            [pc: 21, line: 17]
            [pc: 28, line: 19]
          Local variable table:
            [pc: 0, pc: 29] local: args index: 0 type: java.lang.String[]
            [pc: 2, pc: 29] local: a index: 1 type: int
            [pc: 4, pc: 21] local: i index: 2 type: int
    }
      

  5.   

    照你说的为什么再把a+1,再循环后第1种情况a是0
    而第2种情况却变成a是1了呢?
      

  6.   

    bytecode 
    相当于汇编语言。通过这个你可以明白a的变化过程
      

  7.   

    你的表达式构成一种恒等的形式,因为你创建的引用int a 在内存的栈中就有一个,而且初值是0;当你进行a++是利用的就是这个引用变量a,但是a++在这次运算结束得到1值前,却再让a引用指向0,这样a引用再次生效,造成不自增的现象,就是自增运算滞后赋值运算的结果。也可以从运算符优先级的方面考虑一下。
      

  8.   

    关键是:
    a=a++;这句
    等效于:
    a=a+1;
    a=0;
    a++表示先赋值,后自增。
      

  9.   

    第一种情况,第一次循环,a=a++;右边的a先赋值给左边的后自增,左边a的值为0,右边a为1,因为计算利用的变量是左边的a,所以a的值最后还是为0
    第二种情况,第一次循环,b=a++;右边的a先赋值给左边后自增,左边b的值为0,右边a为1,所以第二次循环b就等于a,值为1,a再自增为2,第三次循环b=2,依次类推,第十次循环b=9;
      

  10.   

    a=a++; //先给a赋值为0 再把a+1, 再循环a还是0 
    b=a++; //先给b赋值为0 再把a+1, 再循环时a已经变成1了 
    我同意这个答案
      

  11.   

    第一种情况,第一次循环,a=a++;右边的a先赋值给左边的后自增,左边a的值为0,右边a为1,因为计算利用的变量是左边的a,所以a的值最后还是为0 
    第二种情况,第一次循环,b=a++;右边的a先赋值给左边后自增,左边b的值为0,右边a为1,所以第二次循环b就等于a,值为1,a再自增为2,第三次循环b=2,依次类推,第十次循环b=9;第二种情况 计算利用的变量为什么不是左边的b
      

  12.   

    问6楼和9楼,怎么可以得得到bytecode