廊坊新闻网-主流媒体,廊坊城市门户

i++和++i的区别(i++和++i的总结)

2022-04-08 09:34:03 来源:刀哥百科

看下面这个案例

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先自增,再入栈

关键词: