`
wenjinglian
  • 浏览: 808312 次
  • 性别: Icon_minigender_1
  • 来自: 株洲->深圳
社区版块
存档分类
最新评论

关于++的一道面试题

阅读更多

面试碰到这样一道题

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,回家试了答案确实不对。

 

还是有点疑惑。

分享到:
评论
28 楼 zxl10059 2011-04-10  
说下我的理解吧
首先i,j都是基本数据类型,所以应该是分配栈内存
j++会在分配新的内存空间K
但这个j++变量的作用域仅局限在for{ }中,所以当执行流完成for循环后
K的内存空间被销毁,再赋值的话,应该还是0
自己瞎想的,欢迎拍砖
27 楼 gglu 2011-04-10  
学习了。
26 楼 cat 2010-10-05  
同bs这样的面试题
25 楼 hekp 2010-10-04  
以前还真没有认真想过这样写i=i++ 呢
24 楼 风照原野 2010-10-04  
我还以为j=99呢
运行一下,结果j=0
23 楼 bcccs 2010-10-03  
<div class="quote_title">wenjinglian 写道</div>
<div class="quote_div">
<p>面试碰到这样一道题 </p>
<p>public static void main(String args[]){<br> int j = 0;<br> for(int i = 0 ; i &lt; 100 ; i ++)<br>  j = j++;<br> System.out.println("j = " + j);<br>}</p>
<p> </p>
<p>四个选项:</p>
<p>A.99   B.100  C.0  D.1</p>
<p> </p>
<p>我当时想了下,选择了B。</p>
<p> </p>
<p>面试时看见答案打了个X,回家试了答案确实不对。</p>
<p> </p>
<p>还是有点疑惑。</p>
</div>
<p>给他写==你妹</p>
<p>见到这样的题目,转身就走。不值得浪费时间。</p>
22 楼 onlylau 2010-10-03  
wmcoo 写道
JAVA 基础啊

J++是先赋值,再运算
++J是先运算,再赋值


看清楚这个题目,是j=j++;按你说的j++是先赋值再运算,那应该是先j=j;然后又j=j+1;那结果应该不是j=0;的呀

重要的是j=j++;这块在c语言和java中是一样的处理机制的
21 楼 holly2k 2010-10-03  
感觉面试的经常就是从题库里拿一些题来的,而这些题又很少真的会在现实编程中遇到
20 楼 wmcoo 2010-10-03  
JAVA 基础啊

J++是先赋值,再运算
++J是先运算,再赋值
19 楼 szcjlssx 2010-10-03  
很明显的是0嘛,这么弱智的题目
18 楼 wenjinglian 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

居然是酱紫的。。
不过,就像上面某楼说的,谁这么写肯定抽死丫


这道题做为面试题还是有点意思
17 楼 wenjinglian 2010-10-02  
<div class="quote_title">onlylau 写道</div>
<div class="quote_div">
<p>java的编译器在遇到i++和i- -的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉<br><br>这个地方跟我们学习i++与++i时的c语言处理不一样<br><br>大家可以看一起这个地方详解:<a href="http://blog.csdn.net/majiabao123/archive/2009/05/17/4194473.aspx" target="_blank">http://blog.csdn.net/majiabao123/archive/2009/05/17/4194473.aspx</a></p>
<p> </p>
</div>
<p>谢谢,blog讲得很详细,C++我也试了确实不一样</p>
16 楼 chende001688 2010-10-02  
j++在后是先赋值给前面的j,还是0
15 楼 onlylau 2010-10-02  
<p>java的编译器在遇到i++和i- -的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉<br><br>这个地方跟我们学习i++与++i时的c语言处理不一样<br><br>大家可以看一起这个地方详解:<a href="http://blog.csdn.net/majiabao123/archive/2009/05/17/4194473.aspx" target="_blank">http://blog.csdn.net/majiabao123/archive/2009/05/17/4194473.aspx</a></p>
<p> </p>
14 楼 onlylau 2010-10-02  
j = j++;
相当于你这里的j的值根本就没有变
13 楼 weiqiang.yang 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

居然是酱紫的。。
不过,就像上面某楼说的,谁这么写肯定抽死丫
12 楼 manchester1878 2010-10-02  
dicmo 写道
如果换成 ++j
结果就不一样了

问题主要出在赋值上,如果只是j++,最后的结果会和大多数人想的一样,但是在赋值时就不一样了
11 楼 wenjinglian 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 ++也有区别,学习了,不过我对栈理解不是很深,谢谢指教!
10 楼 dicmo 2010-10-01  
如果换成 ++j
结果就不一样了
9 楼 飞语001 2010-10-01  
以后面试多了,这种题肯定也就见的多了。

相关推荐

Global site tag (gtag.js) - Google Analytics