论坛首页 招聘求职论坛

关于++的一道面试题

浏览 10132 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-09-30   最后修改:2010-09-30

面试碰到这样一道题

public static void main(String args[]){
 int j = 0;
 for(int i = 0 ; i < 100 ; i ++)
  j = j++;
 System.out.println("j = " + j);
}

 

四个选项:

A.99   B.100  C.0  D.1

 

我当时想了下,选择了B。

 

面试时看见答案打了个X,回家试了答案确实不对。

 

还是有点疑惑。

   发表时间:2010-09-30  
int j = 0;
j = j++;

先拿出右边j++之前的值放在一边,假设叫original( = 0)
然后执行右侧的j = j + 1;
最后执行赋值操作j = original( = 0)
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);
0 请登录后投票
   发表时间:2010-10-01  
debug一下就知道是怎么出来结果的了
0 请登录后投票
   发表时间:2010-10-01  
鄙视这样的面试题,谁要是敢在程序里写这样的代码,抽死他丫的。
1 请登录后投票
   发表时间: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型本地变量推送至栈顶
2 请登录后投票
   发表时间: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++;
0 请登录后投票
   发表时间:2010-10-01  
ggggqqqqihc 写道
鄙视这样的面试题,谁要是敢在程序里写这样的代码,抽死他丫的。

哈哈 
0 请登录后投票
   发表时间:2010-10-01  
求详细解答!
0 请登录后投票
   发表时间:2010-10-01  
以后面试多了,这种题肯定也就见的多了。
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics