Difference between pre-increment and post-increment in a loop?

后端 未结 22 1792
暗喜
暗喜 2020-11-21 23:41

Is there a difference in ++i and i++ in a for loop? Is it simply a syntax thing?

22条回答
  •  醉酒成梦
    2020-11-22 00:26

    Here is a Java-Sample and the Byte-Code, post- and preIncrement show no difference in Bytecode:

    public class PreOrPostIncrement {
    
        static int somethingToIncrement = 0;
    
        public static void main(String[] args) {
            final int rounds = 1000;
            postIncrement(rounds);
            preIncrement(rounds);
        }
    
        private static void postIncrement(final int rounds) {
            for (int i = 0; i < rounds; i++) {
                somethingToIncrement++;
            }
        }
    
        private static void preIncrement(final int rounds) {
            for (int i = 0; i < rounds; ++i) {
                ++somethingToIncrement;
            }
        }
    }
    

    And now for the byte-code (javap -private -c PreOrPostIncrement):

    public class PreOrPostIncrement extends java.lang.Object{
    static int somethingToIncrement;
    
    static {};
    Code:
    0:  iconst_0
    1:  putstatic   #10; //Field somethingToIncrement:I
    4:  return
    
    public PreOrPostIncrement();
    Code:
    0:  aload_0
    1:  invokespecial   #15; //Method java/lang/Object."":()V
    4:  return
    
    public static void main(java.lang.String[]);
    Code:
    0:  sipush  1000
    3:  istore_1
    4:  sipush  1000
    7:  invokestatic    #21; //Method postIncrement:(I)V
    10: sipush  1000
    13: invokestatic    #25; //Method preIncrement:(I)V
    16: return
    
    private static void postIncrement(int);
    Code:
    0:  iconst_0
    1:  istore_1
    2:  goto    16
    5:  getstatic   #10; //Field somethingToIncrement:I
    8:  iconst_1
    9:  iadd
    10: putstatic   #10; //Field somethingToIncrement:I
    13: iinc    1, 1
    16: iload_1
    17: iload_0
    18: if_icmplt   5
    21: return
    
    private static void preIncrement(int);
    Code:
    0:  iconst_0
    1:  istore_1
    2:  goto    16
    5:  getstatic   #10; //Field somethingToIncrement:I
    8:  iconst_1
    9:  iadd
    10: putstatic   #10; //Field somethingToIncrement:I
    13: iinc    1, 1
    16: iload_1
    17: iload_0
    18: if_icmplt   5
    21: return
    
    }
    

提交回复
热议问题