对这个问题的探讨来自昨天网易的一道笔试题
考点1:i++和++i
package algorithms.com.guan.javajicu;
public class Inc {
public static void main(String[] args) {
Inc inc = new Inc();
int i = 0;
inc.fermin(i);
i= i ++;
System.out.println(i);
}
void fermin(int i){
i++;
}
}
输出结果为0!(惊不惊喜,意不意外)
分析一下
忘了之前在哪看到了下面的描述:
i++:先赋值,后加1;
++i:先加1,后赋值。
没搞懂的我默默背下来并当做了一个模板。
情景一:b=i++
public class Test {
public static void main(String args[]) {
int i = 0;
int b = i++;
System.out.println(b);
System.out.println(i);
}
}
套个模板:
先赋值,b=0;后加1,i=1。
代码一跑没毛病。
情景二:b=++i
public class Test {
public static void main(String args[]) {
int i = 0;
int b = ++i;
System.out.println(b);
System.out.println(i);
}
}
再套下:
先加1,i=1;后赋值,b=1。
代码一跑没毛病。
情景三:i=i++
套个模板来,i=i++;
先赋值,后加1→先是i=0后是i=1。
满心欢喜:”输出i是1!”
public class Test {
public static void main(String args[]) {
int i = 0;
i= i++;
System.out.println(i);
}
}
代码一跑,结果是0。
模板错了吗??
情景四:i=++i
public class Test {
public static void main(String args[]) {
int i = 0;
i= ++i;
System.out.println(i);
}
}
不知道对不对,再套一下:
先加1,后赋值,i=1。
代码一跑没毛病。
咋到了i=i++就不好使了呢?
深入分析一下
在网上一番扒拉,得出结论是:
1、单纯看i++和++i,++在前或者在后没有区别,结果都是i+1
public class Test {
public static void main(String args[]) {
int i = 0;
i++;
System.out.println(i);
}
}
public class Test {
public static void main(String args[]) {
int i = 0;
++i;
System.out.println(i);
}
}
输出的都是1。
2、区别在赋值,也就是“=”上;
- i++,左边符号遇到“=”赋值为i自增前的值;
- ++i,左边符号遇到“=”赋值为i自增后的值。
原因就是i++运用了中间变量缓存机制,而++i没有
参考链接:https://my.oschina.net/u/3568600/blog/1794573/
i++ 有中间缓存变量, i = i++ 等价于
temp = i;
i = i + 1;
i = temp;
再次分析上面四个情景:
- b=i++;b遇到“=”赋值i为自增前的值0 ;
- b=++i;b遇到“=”赋值i为自增后的值1;
- i=i++;i遇到“=”赋值为i自增前的值0 ;
- i=++i;i遇到“=”赋值为i自增后的值1;
以上是个人理解,如有误请大家指正,感谢!