声明一个int型的i=0
i = i++;
打印i
C++/C 里面输出1
as3/java/c# 里面输出0
为什么呢???
嘻嘻
很明显 在AS3/JAVA/C#这种托管型面向对象语言中
当遇到这种声明时 我觉得他们在底层开辟了2个管道, 也就是再复制了有一个对象i 和原对象i
是2个 内存地址了 然后一个指针在指2个地址, 后i拷贝到前面的i上, 指针指导前一个上
但是++ 属于=后的管道i
所以 输出i=0;
而在C++ 中 i将会指向同一快内存地址 因此结果i
网上一个网友的解释:
java里的i++
iconst_0
istore_1
iload_1
iinc 1,1
istore_1
因为这里jvm会将i的初始值(0)暂存入堆栈,然后对变量区的i进行自加,而istore_1又会接着把堆栈的i(0)赋给变量区的i,所以最后i还是0,FP的情况应该是一样的,如果换成i=++i就会得到1,原因是因为i=++i是先对变量区中的i自加1,然后再将变量区中i的值(1)存入堆栈
我觉得更直接~ 从底层说明了原因
i = i++;
打印i
C++/C 里面输出1
as3/java/c# 里面输出0
为什么呢???
嘻嘻
很明显 在AS3/JAVA/C#这种托管型面向对象语言中
当遇到这种声明时 我觉得他们在底层开辟了2个管道, 也就是再复制了有一个对象i 和原对象i
是2个 内存地址了 然后一个指针在指2个地址, 后i拷贝到前面的i上, 指针指导前一个上
但是++ 属于=后的管道i
所以 输出i=0;
而在C++ 中 i将会指向同一快内存地址 因此结果i
网上一个网友的解释:
java里的i++
iconst_0
istore_1
iload_1
iinc 1,1
istore_1
因为这里jvm会将i的初始值(0)暂存入堆栈,然后对变量区的i进行自加,而istore_1又会接着把堆栈的i(0)赋给变量区的i,所以最后i还是0,FP的情况应该是一样的,如果换成i=++i就会得到1,原因是因为i=++i是先对变量区中的i自加1,然后再将变量区中i的值(1)存入堆栈
我觉得更直接~ 从底层说明了原因