++:自加,这是个单目运算符,i++表示先把操作数放入表达式中运算,然后才把操作数加1;++i表示先把操作数加1,然后才把操作数放入表达式中运算。我们已经知道了含义,下面通过几段代码来对其进行更深入的分析
public class Test {
public static void main(String[] args) {
int i = 0;
int j = i++;
System.out.println(i);
System.out.println(j);
}
}
输出结果是:
1
0
通过javap命令分析main方法中前两行的汇编指令,如下:
public static void main(java.lang.String[]);
Code:
0: iconst_0 //push int 0 constant onto the operand stack
1: istore_1 //store int from operand stack into local variable at index 1
2: iload_1 //load int from local variable at index 1 and push onto operand stack
3: iinc 1, 1 //increment the int from the local variable at index indicated by the index byte (unsigned 8-bit integer), with constbyte (signed 8-bit integer)
6: istore_2 //store int from operand stack into local variable at index 2
注意://后面的是对应指令的解释,可以参考jvm_instruction_set,其余指令比较好理解,但对于iinc需要解释一下,该命令接受两个值,用逗号隔开,第一个值表示局部变量表中变量的下标,第二个值表示增加的值,所以“iinc 1, 1”的含义是,将局部变量表中下标为1的值加1。整个的过程就是:把int类型的值0push到操作数栈中、将操作数栈中的int类型的值存储到局部变量表中下标为1的变量i中(操作完成后的操作数栈为空)、将局部变量表中下标为1的整型值push到操作数栈中、然后在局部变量表中对下标为1的变量i加1、最后把操作数栈中的值存储到局部变量表中下标为2的变量j中,这样就解释明白了。
接下来看另外一段代码
public class Test {
public static void main(String[] args) {
int i = 0;
int j = ++i;
System.out.println(i);
System.out.println(j);
}
}
输出结果是:
1
1
通过查看下汇编指令
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iinc 1, 1
5: iload_1
6: istore_2
与上面不同的是,它首先会执行iinc,然后在执行iload_1,即在局部变量表中将i的值加1,然后再赋值给j。