public class Test {

public static void main(String[] args) {
int i = 0;
fun(i);
System.out.println(i);
i = i++;
System.out.println(i);
}

public static void fun(int i) {
i++;
}
}
为什么第二个i输出结果是0?

解决方案 »

  1.   

    http://blog.csdn.net/ZangXT/archive/2008/11/05/3229281.aspx
    希望能看懂。
      

  2.   

    晕 这题目我见过好几次了java 的语言规范!
    对于简单的代码  
    int i=i++; 等效于
    int t=i;
    i=i+1;
    i=t;
    所以 i 最后还是没变我也是看别人的帖子的  这是java 的语言规范 和 c 不一样 好像是因为 编译器不一样的原因 这样写 编译的速度会快点吧~~~ 
      

  3.   

    i++等同于i+=1;
    ++放在变量前面时:表示先把变量进行+1再赋值
    ++放在变量后面时:表示先把变量进行赋值再把变量进行+1操作
    i = i++;相当于,先进行赋值,再进行+1操作,最后";"结束,则打印结束为:0
    调用fun(i)后,这时i已经进行了+1的操作了,则打印结果为:1LZ发贴前可以先看看以前的贴是否有类似的内容,讲的很全面的
      

  4.   

    java 的语言规范! 
    对于简单的代码  
    int i=i++; 等效于 
    int t=i; 
    i=i+1; 
    i=t; 
    所以 i 最后还是没变 我也是看别人的帖子的  这是java 的语言规范 和 c 不一样 好像是因为 编译器不一样的原因 这样写 编译的速度会快点吧~~~ 
      

  5.   

    i=i++;
    1:1=i;
    2:i=i+1;
      

  6.   

    int i=i++;  有问题 我定义错了
      

  7.   

    基本上说对了,我想补充的是:如果在没有变量直接接受i++或者++i的结果的话,它们两个是一样的,如:
    单纯的在一句中 i++;或者 ++i; 是等效的; 这里我们就假设 i=0;
    当 int temp1 = i++;或者 int temp2 = ++i;
    则 temp1 = 0;  temp2 = 1; 就是5楼的解释了 
      

  8.   

    不要跟C比较,C语言规范并没有规定这种情况下的求值顺序,所以不同的C语言编译器得到的结果可能是不同的。
    而java语言规范规定了具体的求值顺序。
      

  9.   

    看到有人这样说:“前置的自增自减是在这一次引用前执行的,后置的操作则是在这一次引用后,下一次引用前执行.”
    那底层实现是不是可以这样理解(和八楼的那样):
    i=i++等价于
    t = i;
    i++;
    i = t;
    是这样吗?
      

  10.   

    说下我对这个知识的理解过程:开始就是记住的一句口诀,i++是先赋值后运算,++i是先运算后赋值.我就一直没搞明白是个啥意思.怎么个运算怎么个赋值.最终我终于领悟到了,这两句所谓的口诀是要和赋值运算符("=")搭配起来用的.比如
    int i , j = 5;
    j = i++;
    System.out.println(j); Output:5j = i;
    System.out.println(j); Output:6
      

  11.   

    i=i++等价于 
    t = i; 
    i++; 
    i = t; 
      

  12.   

    1 java中基本类型的传递都是值传递,所以第一个i的输出结果是0;
    2 等号右边如果是表达式,则先执行表达式,再把返回结果赋值给左边
    i = i++;
    表示:先执行等号右边的i++,也就是说,这时i的值是1;
    然后把表达式i++的结果返回给左边,由于i++本身的返回值是0,所以把原来的1覆盖了,最后i的值就是0
      

  13.   

    i=0;
    i = i++;
    i++先i=0操作完再i+1,i++的值是0