i++ 、 ++i和i+=1、i=i+1 的问题
逻辑运算中,关于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);
}
}
执行结果为:1,2,0,2;
我们获取以下方法执行时的指令集
public static int print1() {
int i = 0;
return i++;
}
public static int print2() {
int i = 0;
return ++i;
}
查看汇编指令如下
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
- 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); 是一个干扰项,考值传递还是引用传递
i=i+1 和 i+=1 的区别
i+=1 会进行自动进行类型转换,相当于如下效果:
short i =1;
i=(short) (i+1);
还没有评论,来说两句吧...