看下面这个案例
inti=1; i=i++; System.out.println(“i=“+ i); intj=i++; System.out.println(“j=“+ j+ “,i=“+ i);
问题:
– `System.out.println(“i=” + i)“i`输出的结果是多少? – `System.out.println(“j=” + j+ “,i=“+ i)“j`和 `i`输出的结果分别是多少?
下面我们看这段代码在jvm中怎么执行的
publicstaticvoidmain(java.lang.String[])throwsjava.io.IOException;descriptor:([Ljava/lang/String;)Vflags:ACC_PUBLIC,ACC_STATICCode:stack=1,locals=3,args_size=10:iconst_1//常量1入栈1:istore_1//常量1出栈,保存到局部变量表槽点1中2:iload_1//槽点1中的变量i的值入栈3:iinc1,1//在局部变量表槽点1中自增1。第一个1是槽点的索引6:istore_1//将指令2中,常量1出栈,保存到局部变量表槽点1中7:iload_1//槽点1中的变量i的值入栈8:iinc1,1//在局部变量表槽点1中自增111:istore_2//将指令7中,常量1出栈,保存到局部变量表槽点2中12:returnLineNumberTable:line 54:0line 55:2line 56:7line 68:12LocalVariableTable:StartLengthSlotNameSignature0130args[Ljava/lang/String;2111iI1212jIExceptions:throwsjava.io.IOExceptionMethodParameters:NameFlagsargsstatic{};descriptor:()Vflags:ACC_STATICCode:stack=1,locals=0,args_size=00:ldc#2 // class com/insuresmart/Test2:invokestatic#3 // Method org/slf4j/LoggerFactory.getLogger:(Ljava/lang/Class;)Lorg/slf4j/Logger;5:putstatic#4 // Field log:Lorg/slf4j/Logger;8:returnLineNumberTable:line 18:0}SourceFile:”Test.java”
inti=1; i=i++;
对应jvm指令如下
0:iconst_1//常量1入栈1:istore_1//常量1出栈,保存到局部变量表槽点1中2:iload_1//槽点1中的变量i的值入栈3:iinc1,1//在局部变量表槽点1中的变量i自增1。第一个1是槽点的索引6:istore_1//将指令2中,常量1出栈,保存到局部变量表槽点1中
不难看出 i++,在jvm中执行时,先将 i的值压入栈中,然后在局部变量表中,i进行自增。
所以上面抛出的问题的答案自然就出来了。
System.out.println(“i=” + i)i输出的结果是多少?i=1
System.out.println(“j=” + j+ “,i=“+ i)j和 i输出的结果分别是多少?j=1,i=2
看下面案例
inti=1; i=++i; i=i++;
我们看下这段代码在jvm中是怎么执行的
publicstaticvoidmain(java.lang.String[])throwsjava.io.IOException;descriptor:([Ljava/lang/String;)Vflags:ACC_PUBLIC,ACC_STATICCode:stack=1,locals=2,args_size=10:iconst_1//常量1入栈1:istore_1//出栈,保存到局部变量表中2:iinc1,1//局部变量表中,变量i进行自增长5:iload_1//局部变量表中的变量i的值(2)入栈6:istore_1//指令5中的数据出栈,保存到局部变量表中7:iload_1//局部变量表中的变量i的值(2)入栈8:iinc1,1//局部变量表中,变量i进行自增长11:istore_1//指令7中的数据出栈,保存到局部变量表中12:returninti=1; i=++i;
对应jvm指令
0:iconst_1//常量1入栈1:istore_1//出栈,保存到局部变量表中2:iinc1,1//局部变量表中,变量i进行自增长5:iload_1//局部变量表中的变量i的值(2)入栈6:istore_1//指令5中的数据出栈,保存到局部变量表中
++i 是先自增长,再入栈
i++和 ++i执行运算时,
i++先入栈,再自增
++i先自增,再入栈
关键词: