发表时间: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
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; |
|
发表时间: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赋值给它自己,就和脱裤子放屁一样不可理喻,如果是我干脆就无视这行代码,这个世界能更清净点。 实际上也说明了,这种代码根本就不应该存在。 |