`

一个牛逼的问题 哈哈 JAVA/AS3/C# 这里托管语言和C++/C的 代码解释差异

阅读更多
声明一个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)存入堆栈


我觉得更直接~  从底层说明了原因
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics