逻辑运算中,关于i++ 、 ++i和i+=1、i=i+1 等这类问题是也笔试必考内容之一,基础中的基础。如果不会,那就已经可以看出你个人的基础水平了。虽然看上去简单,但是不懂原理是不行的。只有了解原理才能记忆最深
i++ 和 ++i 的区别:i++:先赋值,在相加,
++i:先相加,在赋值
实战以下,看以下代码
public class Test {public static int print1() { int i = 0; i++; return i++;}public static int print2() {int i = 0;i++;return ++i;}public static void main(String[] args) {System.out.println(print1());System.out.println(print2()); int i=0;System.out.println(i++); System.out.println(++i);} }
12345678910111213141516171819执行结果为:1,2,0,2;
我们获取以下方法执行时的指令集
public static int print1() { int i = 0; return i++; } public static int print2() { int i = 0; return ++i; } 12345678
查看汇编指令如下
public static int print1(); Code: 0: iconst_0//将int类型常量0压入栈 1: istore_0//将int类型值存入局部变量 2: iload_0//第一个int型局部变量进栈 3: iinc 0, 1//把一个常量值加到一个int类型的局部变量上,0 表示局部变量索引 6: ireturn//将操作数栈栈顶的值返回个此方法的调用者 LineNumberTable: line 5: 0 line 6: 2 public static int print2(); Code: 0: iconst_0//将int类型常量0压入栈 1: istore_0//将int类型值存入局部变量 2: iinc 0, 1 //把一个常量值加到一个int类型的局部变量上,0 表示局部变量索引 5: iload_0//第一个int型局部变量进栈 6: ireturn //将操作数栈栈顶的值返回个此方法的调用者 LineNumberTable: line 5: 0 line 6: 2
123456789101112131415161718192021 iload_0 指将整型指存入操作数栈iinc 用于实现局部变量的自增操作。在所有字节码指令中,只有该指令可直接用于操作局部变量。ireturn 是将操作数栈栈顶的值返回个此方法的调用者i=i++到底是怎么执行的
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; inc.fermin(i); 是一个干扰项,考值传递还是引用传递 1234567891011121314 i=i+1 和 i+=1 的区别
i+=1 会进行自动进行类型转换,相当于如下效果:
short i =1; i=(short) (i+1); 12