public class Ab { public static void main(String argv[]) { Ab ab = new Ab(); int i =0; System.out.println("label1: "+i); ab.fermin(i); //System.out.println("label2: "+i); i = i++; //System.out.println("label3: "+i); } void fermin(int i) { i++; System.out.printl("label:"+i); } } 如你所愿
首先是代码可阅读性差,把自己绕进去
其次,++的值改变有一定次序问题,这个可能具体平台还有些差别
所以,研究一下可以,但是不要乐此不疲。在实际使用中,除了一些很明显的使用之外,应该尽量避免传递基本类型的参数时,编译器将参数的值传递到方法中。如果在方法修改传递过来的参数的值,并不会影响原参数的值。
所以你的第二个输出还是0
至于第三个,需要分析一下这个表达式i=i++;
其实它等于(i=i)++; 结果i=0
如果你只是让i自加1直接用i++;就可以了
j=i;
i=i+1;
i=j;
-----------------------------------
还是不懂
其实它等于(i=i)++; 结果i=0
如果你只是让i自加1直接用i++;就可以了
-------------------------
这个解释好象并不合适;(i=i)++ 这样的表达式也是非法的 ;那个++ 到底跑哪里去了?谁知道?
++做后缀时其操作是先求值再自加1
所以i=i++就是先将i赋给左值,然后再自加,但是自加时已经不是自加到i上了
因为i已经由等式左值确定了,所以自加的是一个临时的变量,这个值不会保存
j=i; //等式右值赋给一个变量
i=j; //求值
j++; //自加不过这有点钻牛角尖了
你可以去看看编译以后的字节码
用javap看看它是怎么个执行顺序
在这里jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。
语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_1是将变量区中的值暂存如堆栈中。
因为i = i++;是先将i的值(0)存入堆栈,然后对变量区中的i自加1,这时i的值的确是1,但是随后的istore_1又将堆栈的值(0)弹出赋给变量区的i,所以最后i = 0。
++做后缀时其操作是先求值再自加1
所以i=i++就是先将i赋给左值,然后再自加,但是自加时已经不是自加到i上了
因为i已经由等式左值确定了,所以自加的是一个临时的变量,这个值不会保存
-----------------------------------似乎确实如此
i=i++; 大致相当于以下三句;
temp=i;
i ++;
i=temp;
可看一下这个
http://www.zdnet.com.cn/developer/code/story/0,2000081534,39213850,00.htm
very good!thanks!
public static void main(String argv[]) {
Ab ab = new Ab();
int i =0;
System.out.println("label1: "+i);
ab.fermin(i);
//System.out.println("label2: "+i);
i = i++;
//System.out.println("label3: "+i);
}
void fermin(int i) {
i++;
System.out.printl("label:"+i);
}
}
如你所愿