锁定老帖子 主题:关于++的一道面试题
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-10-01
如果换成 ++j
结果就不一样了 |
|
返回顶楼 | |
发表时间:2010-10-01
chimer 写道 看到这个题目我才注意到它和C++ 处理 ++ 时候的不同
C中 j = j++; 是这么处理的 // ......略以上 // edx 寄存 j mov edx,dword ptr [ebp-4] // j=j add edx,1 // j++ mov dword ptr [ebp-4],edx 拆开就是 先处理 j=j ,再处理 j++ ----------------------------------------- java 是这么做的 0: iconst_0 1: istore_1 // j 2: iconst_0 3: istore_2 // i 4: iload_2 5: bipush 100 7: if_icmpge 21 10: iload_1 // 栈顶压入 j 的值 0 11: iinc 1, 1 // j++ ,可以看到已经做了 i++,但是操作的地方确是局部变量的值,没有动栈顶 iload_1 的那个 0 14: istore_1 // 存储栈顶的 0 到 j ,所以多少次运算,j还是0 15: iinc 2, 1 // 可以看到做 i++ 的时候并没有相关的栈操作 18: goto 4 -------------------------- 看出这个运算的区别还是挺大的,主要在于值的复制 关于一些指令: iconst_0 将int型0推送至栈顶 istore_n 将栈顶int型数值存入第 n 个本地变量 iload 将指定的int型本地变量推送至栈顶 C++与java ++也有区别,学习了,不过我对栈理解不是很深,谢谢指教! |
|
返回顶楼 | |
发表时间:2010-10-02
dicmo 写道 如果换成 ++j
结果就不一样了 问题主要出在赋值上,如果只是j++,最后的结果会和大多数人想的一样,但是在赋值时就不一样了 |
|
返回顶楼 | |
发表时间:2010-10-02
0: iconst_0 1: istore_1 2: iconst_0 3: istore_2 4: goto 15 7: iload_1 8: iinc 1, 1 11: istore_1 12: iinc 2, 1 15: iload_2 16: bipush 100 18: if_icmplt 7 居然是酱紫的。。 不过,就像上面某楼说的,谁这么写肯定抽死丫 |
|
返回顶楼 | |
发表时间:2010-10-02
j = j++;
相当于你这里的j的值根本就没有变 |
|
返回顶楼 | |
发表时间:2010-10-02
java的编译器在遇到i++和i- -的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉
|
|
返回顶楼 | |
发表时间:2010-10-02
j++在后是先赋值给前面的j,还是0
|
|
返回顶楼 | |
发表时间:2010-10-02
onlylau 写道
java的编译器在遇到i++和i- -的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉
谢谢,blog讲得很详细,C++我也试了确实不一样 |
|
返回顶楼 | |
发表时间:2010-10-02
weiqiang.yang 写道 0: iconst_0 1: istore_1 2: iconst_0 3: istore_2 4: goto 15 7: iload_1 8: iinc 1, 1 11: istore_1 12: iinc 2, 1 15: iload_2 16: bipush 100 18: if_icmplt 7 居然是酱紫的。。 不过,就像上面某楼说的,谁这么写肯定抽死丫 这道题做为面试题还是有点意思 |
|
返回顶楼 | |
发表时间:2010-10-03
很明显的是0嘛,这么弱智的题目
|
|
返回顶楼 | |