Java:i++问题(详细分析)
看着其实比较明确了,但是说实话其实没看懂,什么是中间缓存变量机制,为什么要有这个,官方文档在哪?
这些问题不是很明了,国外的权威资料暂时也没得求证,所以索性从字节码的角度来理解这个问题。
解法二
通过javap工具查看虚指令,通过虚指令理解c=c++到底做了什么。
下面结果只保留部分主要内容来说明c=c++和其它几种情况的不同,直接翻译虚指令对应程序中的具体操作。
[root@z1 classdir]# javap -verbose SumPlusTestClassfile /mnt/workspace/java/i++issue/classdir/SumPlusTest.class Last modified Sep 3, 2015; size 794 bytes MD5 checksum 3a406dc81fe69722d53ce74ef96516a4public class SumPlusTest minor version: 0 major version: 51 flags: ACC_PUBLIC, ACC_SUPERConstant pool: #1 = Methodref #14.#30 // java/lang/Object."<init>":()V #2 = Fieldref #31.#32 // java/lang/System.out:Ljava/io/PrintStream; ...... #54 = Utf8 println #55 = Utf8 (Ljava/lang/String;)V{ public SumPlusTest(); flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LSumPlusTest; public static void main(java.lang.String[]); flags: ACC_PUBLIC, ACC_STATIC Code: stack=3, locals=5, args_size=1 0: iconst_1 1: istore_1 #0,1相当于是执行a=1 2: iconst_1 3: istore_2 #2,3相当于是执行b=1 4: iconst_1 5: istore_3 #4,5相当于是执行c=1 6: iconst_1 7: istore_4 #6,7相当于是执行d=1 9: iinc 1, 1 #相当于执行a的值+1 12: iinc 2, 1 #相当于执行b的值+1 15: iload_3 #将c的值放入栈顶 16: iinc 3, 1 #执行c的值+1 19: istore_3 #再将栈顶的值赋值给c,此时即c=1 20: iinc 4, 1 #相当于是执行d的值+1 23: iload 4 #把d的值放置于栈顶 25: istore 4 #然后将栈顶的值付给d这个变量,此时d=2 ...... LocalVariableTable: Start Length Slot Name Signature 0 81 0 args [Ljava/lang/String; 2 79 1 a I 4 77 2 b I 6 75 3 c I 9 72 4 d I}