public static void main(String[] args) {
int j = 0;
for (int i = 0; i < 100; i++) {
// 这里是第赋值再执行运算,但是运算为什么没有执行?
j = j++;
}
System.out.println(j);
// --------------------
int x = 0;
for (int i = 0; i < 100; i++) {
// 这里是把上面的j=j++;改成了一下,按理论来说这两个应该是相同的结果吧。
// 先赋值再执行运算
x = x;
x++;
}
System.out.println(x);
// --------------------
int z = 0;
int y = 0;
for (int i = 0; i < 100; i++) {
// 这里把第一个改了一下,接收值的变量并非是自己改变了一下
y = z++;
}
System.out.println("z:" + z + ",y:" + y);
}
j=j++;全等于 j=j;j++;吗?
全等,为什么?
不全等,为什么?
请仔细看上面的例子。

解决方案 »

  1.   

    在这里jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。 
    语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_1是将变量区中的值暂存如堆栈中。 
    因为j = j++;是先将i的值(0)存入堆栈,然后对变量区中的j自加1,这时j的值的确是1,但是随后的istore_1又将堆栈的值(0)弹出赋给变量区的j,所以最后j = 0。 也就是说你执行100次j=j++,最后j也是0,但是你要是j=++j执行100次最后j=100,原理因为j = ++j;是先对变量区中的j自加1,然后再将变量区中i的值(1)存入堆栈,虽然最后执行了istore_1,但也只是将堆栈中的值(1)弹出赋给变量区的j,所以j = ++j;的结果是j = 1。
    x = x;//这句话是没用任何用处的,程序没有做任何执行任务,是一句垃圾代码
    x++;//x做了一次自加操作
      

  2.   

    i++的情况 
    iconst_0 
    istore_1 
    iload_1 
    iinc 1,1 
    istore_1 ++i的情况 
    iconst_0 
    istore_1 
    iinc 1,1 
    iload_1 
    istore_1
      

  3.   


    public static void main(String[] args) {
            int j = 0;
            for (int i = 0; i < 100; i++) {
                // 这里是第赋值再执行运算,但是运算为什么没有执行?
                j = j++;
               //这里是后++,j++ = 0;所以j永远等于0。因为后++先赋值再++
            }
            System.out.println(j);
            // --------------------
            int x = 0;
            for (int i = 0; i < 100; i++) {
                // 这里是把上面的j=j++;改成了一下,按理论来说这两个应该是相同的结果吧。
                // 先赋值再执行运算
                x = x;
                x++;
             //这个跟上面的不同在于,x=x;赋值本身后,做了++运算,。而上面j每次都归0
            }
            System.out.println(x);
            // --------------------
            int z = 0;
            int y = 0;
            for (int i = 0; i < 100; i++) {
                // 这里把第一个改了一下,接收值的变量并非是自己改变了一下
                y = z++;
            }
            System.out.println("z:" + z + ",y:" + y);
        }