论坛首页 入门技术论坛

令我迷惑的 i++

浏览 5995 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-11-18  

令我迷惑的 i++

      我在准备面试时遇见了着样一道题:

java 代码
  1. public class Inc {   
  2.     public static void main(String[] args) {   
  3.         Inc inc = new Inc();   
  4.         int i = 0;   
  5.         inc.fermin(i);   
  6.         i = i++;      //陷阱   
  7.         System.out.println(i);   
  8.     }   
  9.     void fermin(int i){   
  10.         i++;   
  11.     }   
  12. }  

 

      令人不解的是最后的输出结果为什么不是我所期望的 1 ,而是 0 。希望能有人用通俗易懂的语言,深入地帮我解释一下,谢谢。 

   发表时间:2007-11-18  
希望有人能把自己的Java教材读一遍再去应聘或者提问
0 请登录后投票
   发表时间:2007-11-18  
基础不牢,搞清楚java方法是传值还是传引用
0 请登录后投票
   发表时间:2007-11-18  
i = i++;不同于i++;
0 请登录后投票
   发表时间:2007-11-18  
bilang 写道
基础不牢,搞清楚java方法是传值还是传引用

lz应该不是错再这里:inc.fermin(i);
而是i = i++;
0 请登录后投票
   发表时间:2007-11-18  
++ 在前面 加了再赋值
++ 在后面 赋值了再加
0 请登录后投票
   发表时间:2007-11-18  
相信楼主的疑问不是在函数参数传递上,因为代码中标明了“陷阱”。
主要的不解是在 i = i++ ;这行代码。

看到楼主就看到了当年的我,今天和女朋友约会没接上头,比较郁闷,就说一下:

    执行这一行代码前i=0,这是毫无疑问的,因为java中对基本类型是用的传值方式(是真实数值,而不是传递引用/指针的值),所以方法调用不会改变参数的原值。
对“i=i++”而言,首先要对i++求值,结果显然是0,原因如何相信看过java基础语法的人都知道。
然后内存中的i执行递增操作,i=1,
然后执行=,由于i++的结果是0,所以i又从1变成0。
over。

0 请登录后投票
   发表时间:2007-11-19  
首先我说明一下,我自己很清楚 fermin(int i) 是按值传递,因此此方法的调用对调用程序没有影响,我想不清楚的是 i++ 的自增在什么时候进行.
0 请登录后投票
   发表时间:2007-11-19  
thehim 写道
首先我说明一下,我自己很清楚 fermin(int i) 是按值传递,因此此方法的调用对调用程序没有影响,我想不清楚的是 i++ 的自增在什么时候进行.

还学人家写程序……
0 请登录后投票
   发表时间:2007-11-19  
能出这样的面试题也够垃圾的,i=i++这种东西讨论起来一点意义都没有。不同的语言,即使是不同的编译器得出的结果也不一样。

对于java这个问题还是比较好解决,反编译一下就可以了。
		int i=0;
		i=i++;

反编译结果
   0:   iconst_0
   1:   istore_1
   2:   iload_1
   3:   iinc    1, 1
   6:   istore_1
0 请登录后投票
论坛首页 入门技术版

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