public class Test { public static void main(String[] args) {
Test t = new Test();
int i = 0;
t.tt(i);
i = i++;
System.out.println(i);
} public void tt(int i) {
i++;
}
}
结果是:0

解决方案 »

  1.   

    tt(int i)对i不生效,i = i++; 先赋值后递增,i不变
    结果当然是0
      

  2.   

    为什么不变了??你把程序改成这样结果还是0呀,那个增不谁增?i?public class Test { public static void main(String[] args) { 
    Test t = new Test(); 
    int i = 0; 
    t.tt(i); 
    i = i++; 
    i = i++;
    i = i++;
    i = i++;
    System.out.println(i); 
    } public void tt(int i) { 
    i++; 

      

  3.   

    把代码改成这样
    public class Test { public static void main(String[] args) { 
    Test t = new Test(); 
    int i = 0; 
    t.tt(i); //这句话对实参i不作任何修改.建议楼主看看java的参数传递.
    i++; System.out.println(i); 
    } public static void tt(int i) { 
    i++; 


    输出是1了,i = i++;是先赋值再自增,所以改为i++
      

  4.   

     tt(int i)对i会生效,但因为没有返回值,所以i的值不变,i = i++; 先赋值后递增,i是0的时候就给了i自己
    i的结果是0不会变的,除非改成i=i+1,才行,
      

  5.   

    正解
    其实我觉得楼主的代码是在讨论两个问题,一个是方法参数的传递问题,另一个i++的用法问题.tt(i)操作的是i变量的一个副本,他不会修改i的值.i = i++中,首先会返回i,然后才将i变量递增所以i = i++ 得到的结果其实是i不变.
    一开始我也没注意,后来在朋友的提醒下才想到的,呵呵.要是面试碰到这个题我绝对就挂了.
      

  6.   

    楼主想问的是什么??是t.tt(i)没有改变i的值还是i=i++后i的值没有改变?
    1-t.tt(i):
      因为在tt中i是局部变量,屏蔽了全局变量i,所以不会改变;
    2-i=i++:(个人理解)
      换成b = (i++);后,b=0,i=1;可见i++确实执行了,只是赋值语句将i的值覆盖了.这只是我的猜测
      
      

  7.   

    不同意3、4、5楼的意见,楼上的意思是不是可以这样理解:
    i=i++可以换成i=0;i++;如果是先赋值,在执行完赋值语句后还是会执行++,只要i++执行,i的值就会+1而不会为0;
      

  8.   

    建议LZ去看这里看看:http://www.bitscn.com/java/base/200605/20350.html
      

  9.   


    同意这个~~关于第一个:俺看过书了,正确关于第二个:i++运算,是先赋值再自增1,也就是说i =i++ ;是将i 赋成0了,但于运算结果推测,应该和6楼的猜测相同!
      

  10.   

    这个题很有迷惑性,曾经有道面试题和这很相似。
    楼主看程序时,先找到类然后找main() 方法,一步一步的往下看:
    main()方法里先生成一个对象,并把首地址给个应用变量t,然后又定义个main()方法里的局部变量i并赋值0;
    走到第三步了,t.tt(i);t调用tt()方法并把实参0传入方法tt(),现在就看tt()方法了
    public void tt(int i) { 
    i++; 

    tt()方法里的入参类型是int,入参名是i,要记住,方法-入参列表-里的入<参变量名>只是个<局部变量>,其作用域就在这个方法里,此时的int i,和int a或者int ii没什么区别,你也可以把此处的入参变量名写成的int a,那程序就成了
    public void tt(int a) { 
    a++; 

    他们的作用是一样的,丝毫影响不到main()方法里的i,当出了这个这个方法后,tt()方法局部变量就消失了,现在往下看i = i++; 此时等号右边的i还是刚才的定义的int i = 0;那个tt()方法改变的只是其局部变量值,出了那个tt()方法就不起作用了,i先把0赋值给等号左边的i,然后再自增1, 然后打印System.out.println(i);此时打印的是等号左边的i而不是等号右边的i,所以结果就是0,sun公司官方的解释是:等号左边和右边的i的地址并不相同,等号右边的i自增后,就消失了。
      

  11.   

    比如下面这个程序按照我上面的解释,出的结果应该是
    public static void main(String args[]){
      inti,j;
      i=0;
      for(j=0;j<5;j++)
      {
        i=i++;  
        System.out.println("i="+i);
      }
    }i=0 
    i=0 
    i=0
    i=0 
    i=0
    因为等号右边的i赋值给左i,然后自增1后就消失了。
      

  12.   


    统一7楼的看法。的却tt(i)的i是一个局部变量,同时它其中的赋值语句。
      

  13.   

    首先
    public void tt(int i) { 
    i++; 

    传进去的不是i,而是i的一个拷贝,所以虽然在方法tt()中执行了i++,但是i是不变的,只是i的拷贝+1,所以执行这个方法后i依然为0
    接着,i=i++;这里是2个过程
    1. i++,此时右边的i还是为0,因为是先赋值后加1
    2. 但此时左边的i变为1了(执行了加1操作)
    3. 接着右边的i赋值给左边的i,所以左边的i=0
    也就是说i先被赋值为1,接着又成为0了,经历了i=1,i=0的变化过程