2010-02-23 127 views
26

可能重複:
Difference between i++ and ++i in a loop?
Is there a difference between x++ and ++x in java?for循環(Java)中的i ++&++ i有什麼區別?

你好,我剛開始學習Java,現在我成循環語句。我不明白++我是如何在for循環語句中工作的。

我的意思是他們是如何工作在數學運算,如加法和減法。我希望有人會向我解釋這一點。

+0

許多現有的實例。簡短的回答:對於本地類型沒有什麼http://stackoverflow.com/questions/484462/difference-between-i-and-i-in-a-loop http://stackoverflow.com/questions/1941391/java-to-i-or-i-and什麼是差異封閉和許多其他取自http://stackoverflow.com/search?q=i%2B%2B+%2B%2Bi – dmckee 2010-02-23 02:16:15

+0

相關:http://stackoverflow.com/questions/1756015/whats -i -i -in-php – jldupont 2010-02-23 02:19:25

+0

++我理論上應該更有效率,因爲i ++只是一個++ i和一個副本(保存較早的值) 但是我想JVM會優化後者在for循環中(至少任何編譯器都可以......) - >沒有區別 – user3063349 2016-07-31 15:08:37

回答

55

它們都增加數字。 ++i相當於i = i + 1

i++++i非常相似但不完全相同。兩者都是遞增數字,但++i遞增計算當前表達式之前的數字,而i++在計算表達式後遞增數字。

int i = 3; 
int a = i++; // a = 3, i = 4 
int b = ++a; // b = 4, a = 4 
+14

但是,爲了回答實際問題,它們在典型的'for'循環用法的上下文中基本相同。 – Amber 2010-02-23 02:16:44

+0

貞操點:'i = i + 1'是一個比'i'初始值多一個值的表達式,這會使它更像'++ i'。 – 2010-02-23 02:48:00

3

兩個i++++i是短手i = i + 1

除了更改i的值之外,它們還會在添加一個(i++)之前或添加一個(++i)之前返回i的值。

在循環中,第三個組件是在每次迭代之後執行的一段代碼。

for (int i=0; i<10; i++) 

那部分的值不使用,所以上面的僅僅是相同

for(int i=0; i<10; i = i+1) 

for(int i=0; i<10; ++i) 

當它使(i++++i之間)的差是在這些情況下

while(i++ < 10) 

for (int i=0; i++ < 10;) 
+0

請參閱TomH在David的回答中的ped,,i = i + 1與++ i相同,不是i ++ :-) – paxdiablo 2010-02-23 02:56:13

5

不同的是,該遞增運算符i++返回i像以前遞增是,和預先遞增運算符++i回報i,因爲它是遞增。如果你問一個典型的for循環:

for (i = 0; i < 10; i++) 

for (i = 0; i < 10; ++i) 

他們是完全一樣的,因爲你不使用i++++i作爲一個更大的表達式的一部分。

21

兩者都將變量i加1。這就像是說i = i + 1。差別是微妙的。如果你在這樣的循環中使用它,沒有任何區別:

for (int i = 0; i < 100; i++) { 
} 

for (int i = 0; i < 100; ++i) { 
} 

如果你想知道其中的差別,看看下面這個例子:

int a = 0; 
int b = a++; // b = 0; a = 1 

a = 0; 
b = ++a: // b = 1; a = 1 

的想法是++a增量a並返回該值,而a++返回a的值,然後遞增a

44

下面是一個示例類:

public class Increment 
{ 
    public static void main(String [] args) 
    { 
     for (int i = 0; i < args.length; ++i) 
     { 
      System.out.println(args[i]); 
     } 
    } 
} 

如果我拆開使用javap.exe這個類我得到這個:

Compiled from "Increment.java" 
public class Increment extends java.lang.Object{ 
public Increment(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(java.lang.String[]); 
    Code: 
    0: iconst_0 
    1: istore_1 
    2: iload_1 
    3: aload_0 
    4: arraylength 
    5: if_icmpge  23 
    8: getstatic  #2; //Field java/lang/System.out:Ljava/io/PrintStream; 
    11: aload_0 
    12: iload_1 
    13: aaload 
    14: invokevirtual #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    17: iinc 1, 1 
    20: goto 2 
    23: return 

} 

如果我改變,因此它使用我++和我再次得到拆解循環這個:

Compiled from "Increment.java" 
public class Increment extends java.lang.Object{ 
public Increment(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(java.lang.String[]); 
    Code: 
    0: iconst_0 
    1: istore_1 
    2: iload_1 
    3: aload_0 
    4: arraylength 
    5: if_icmpge  23 
    8: getstatic  #2; //Field java/lang/System.out:Ljava/io/PrintStream; 
    11: aload_0 
    12: iload_1 
    13: aaload 
    14: invokevirtual #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    17: iinc 1, 1 
    20: goto 2 
    23: return 

} 

當我比較兩者時,TextPad告訴我兩者是相同的。

這是說,從生成的字節碼的角度來看,循環沒有區別。在其他情況下,++ i和i ++之間有區別,但不適用於循環。

+9

+1。 – paxdiablo 2010-02-23 02:57:20

+0

這並不是循環,而是它不在更大的表達上下文中。如果你的循環結束表達式更復雜,它可能會有很大的不同。 – 2010-02-23 18:56:36

+0

我將在循環示例中添加更多內容,然後再次嘗試查看。 – duffymo 2010-02-23 23:12:42

7

for循環的方式進行處理是如下

1首先,進行初始化(I = 0)

2執行檢查(ⅰ< N)

3中的代碼循環被執行。

4中的值遞增

5重複步驟2 - 4

這就是爲什麼原因,存在和在for循環是,已經使用無差異之間我++ ++我。

+0

這是我一直在尋找的答案。謝謝! – Chris 2015-03-24 20:45:06

相關問題