阅读 14970 次
发表时间:2010-10-09
恋曲2000 写道
即JAVA先将i的值保存到临时内存空间中,然后处理++,即原来的j加1
----------------------------------
应该是先将j的值保存到临时内存空间中吧。


笔误,已更正。谢谢。
发表时间:2010-10-09
楼主的贴子里称呼自己从来不用“我”,总是用名称来自称,很有意思!
发表时间:2010-10-09
tianfing 写道
楼主的贴子里称呼自己从来不用“我”,总是用名称来自称,很有意思!

哈哈哈。被你发现了。呵呵。因为很喜欢"polaris"这个词哦。
发表时间:2010-10-10
这些题目确实意义不大。。。
发表时间:2011-07-18
int j=0;j=j++;
编译后的汇编代码为:
   iconst_0      //常量0
   istore_1 [j]  //j<=0
   iload_1 [j]   //temp<=j
   iinc 1 1 [j]  //j = j+1
   istore_1 [j]  //j=temp

在第三条指令中,首先把j的值进行转存,然后对j进行inc操作,第五条指令把之前存储的值加载到变量j中,所以执行完j==0

但是这种方式比较难以理解,和后缀++,先取值,再计算的概念有些冲突,比如换个变量接收 i=j++,这是j的值就是1,显然java的这种处理令人费解
发表时间:2011-08-05




第一题的字节码,关键在于第四条指令,3 iinc 1 by 1:

iinc(vindex, const):把索引为vindex的局部变量和常数const进行相加,结果存入索引为vindex的局部变量

即是说,这条指令的操作完全是对局部变量的,操作结果不会push到栈中,因此,这条指令执行完毕后,栈顶实际上保存的是第三条指令的结果,即读取第一个局部变量,int类型,push,iload_1,即整数0

紧接着第五条指令是将栈顶内容存入局部变量1中,因此,局部变量j就给赋值为0了;

 

这个造成0的问题我觉得应该是编译器的问题,无论从字面上看,写法与结果的不一致,还是从字节码上看,都很有问题;

指令行3的代码 iload_1 放在这里觉得非常离奇和没有必要,既然 iinc 指令不需要栈顶参数,那么没道理事先 iload 一下;

个人觉得这段代码应该是这样

iconst_0;//常数0

istore_1;//j=0

iinc 1 by 1;//j++

iload_1;//从局部变量中提取上一个指令的结果

istore_1;//将结果存入指定局部变量中

然后编译器再就此进行优化,最后两行可以删除:除非变量 j 不是局部变量,而是对象的属性,并且声明了volatile;

  • 大小: 13.2 KB
发表时间:2011-09-08
恋曲2000 写道
即JAVA先将i的值保存到临时内存空间中,然后处理++,即原来的j加1
----------------------------------
应该是先将j的值保存到临时内存空间中吧。


这个解释太绕口了。 其实可以简单的解释为,java里所有的基本类型赋值都不是指针。
发表时间:2011-09-08
tarsean 写道
int j=0;j=j++;
编译后的汇编代码为:
   iconst_0      //常量0
   istore_1 [j]  //j<=0
   iload_1 [j]   //temp<=j
   iinc 1 1 [j]  //j = j+1
   istore_1 [j]  //j=temp

在第三条指令中,首先把j的值进行转存,然后对j进行inc操作,第五条指令把之前存储的值加载到变量j中,所以执行完j==0

但是这种方式比较难以理解,和后缀++,先取值,再计算的概念有些冲突,比如换个变量接收 i=j++,这是j的值就是1,显然java的这种处理令人费解


没什么费解的, i=j++ 的逻辑是,把j的值赋给i,然后j+1
j=j++的逻辑是, j的值赋给新j,老j+1,然后老j已经没有了identifier(它的identifier被重用了),丢弃。
发表时间:2011-09-08
面这种题目直接鄙视走人
发表时间:2011-09-08
polaris1119 写道
icefishc 写道
polaris1119 写道
icefishc 写道

c++的事还真不能靠试。。。 在c++这个应该是undefined behavior

undefined behavior?从何体现?编译不通过?

undefined behavior的意思就是
它的结果不确定,也许取决于你用的编译器也许取决于你的优化参数或其他外部条件。
你所看到的结果只是一种可能。

你说的有道理,这个结果的确跟编译器有关,而C++编译器又有不同的实现,因而可能结果真的不一样。我用VS测试结果是1。

显然这和编译器优化有关。 就编译器的角度来看,你把j赋值给它自己,就和脱裤子放屁一样不可理喻,如果是我干脆就无视这行代码,这个世界能更清净点。 实际上也说明了,这种代码根本就不应该存在。
Global site tag (gtag.js) - Google Analytics