锁定老帖子 主题:关于++的一道面试题
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-09-30
最后修改:2010-09-30
面试碰到这样一道题 public static void main(String args[]){
四个选项: A.99 B.100 C.0 D.1
我当时想了下,选择了B。
面试时看见答案打了个X,回家试了答案确实不对。
还是有点疑惑。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-09-30
int j = 0;
j = j++; 先拿出右边j++之前的值放在一边,假设叫original( = 0) 然后执行右侧的j = j + 1; 最后执行赋值操作j = original( = 0) |
|
返回顶楼 | |
发表时间:2010-09-30
fallen_lord 写道 int j = 0;
j = j++; 先拿出右边j++之前的值放在一边,假设叫original( = 0) 然后执行右侧的j = j + 1; 最后执行赋值操作j = original( = 0) 最后才执行赋值为orginal,我以为是先对j赋值最后对 j+1 再循环。 以这种去解了: int j = 0; int k = j++; System.out.println(j); |
|
返回顶楼 | |
发表时间:2010-10-01
debug一下就知道是怎么出来结果的了
|
|
返回顶楼 | |
发表时间:2010-10-01
鄙视这样的面试题,谁要是敢在程序里写这样的代码,抽死他丫的。
|
|
返回顶楼 | |
发表时间:2010-10-01
看到这个题目我才注意到它和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型本地变量推送至栈顶 |
|
返回顶楼 | |
发表时间:2010-10-01
最后修改:2010-10-03
补充一个指令:
iinc 将指定int型变量增加指定值 ---再补充 有人说有疑惑,我看了下,注释那里有个地方写错了 java代码区 11: iinc 1, 1 // j++ ,可以看到已经做了 i++,但是操作的地方确是局部变量的值,没有动栈顶 iload_1 的那个 0 这里应该都是 j ,我后面一个写成 i++ 了,实际是 j++,即更改为 11: iinc 1, 1 // j++ ,可以看到已经做了 j++,但是操作的地方确是局部变量的值,没有动栈顶 iload_1 的那个 0 即 java 中是先做j++,在做j=j(大概这么理解,其实实际又不对,具体看下面详细),步骤是和C/C++相反(其实按理这才是对的,因为++比=号优先级高诶,c/c++也是这个优先级,不知道为啥它的编译器处理的时候就变了捏。) 按照这个道理的话,那么应该结果不是0的,为啥会输出0呢,关键就在 10 和 14行,赋值j=j的时候是从栈顶拿的值而不是局部变量j中存的 对比几种情况,就发现并不是简单的代替了。即 j++ 这一步都做了的,关键就在于从哪拿值赋回去 10: iinc 1, 1 13: iload_1 14: istore_1 // j = ++j; 100 10: iload_1 11: istore_1 12: iinc 1, 1 // j=j;j++; 100 10: iinc 1, 1 13: iload_1 14: istore_1 // j++;j=j; 100 10: iload_1 11: iinc 1, 1 14: istore_1 // j=j++; |
|
返回顶楼 | |
发表时间:2010-10-01
ggggqqqqihc 写道 鄙视这样的面试题,谁要是敢在程序里写这样的代码,抽死他丫的。
哈哈 |
|
返回顶楼 | |
发表时间:2010-10-01
求详细解答!
|
|
返回顶楼 | |
发表时间:2010-10-01
以后面试多了,这种题肯定也就见的多了。
|
|
返回顶楼 | |