可能重複:
Difference between i++ and ++i in a loop?
Is there a difference between x++ and ++x in java?for循環(Java)中的i ++&++ i有什麼區別?
你好,我剛開始學習Java,現在我成循環語句。我不明白++我是如何在for循環語句中工作的。
我的意思是他們是如何工作在數學運算,如加法和減法。我希望有人會向我解釋這一點。
可能重複:
Difference between i++ and ++i in a loop?
Is there a difference between x++ and ++x in java?for循環(Java)中的i ++&++ i有什麼區別?
你好,我剛開始學習Java,現在我成循環語句。我不明白++我是如何在for循環語句中工作的。
我的意思是他們是如何工作在數學運算,如加法和減法。我希望有人會向我解釋這一點。
它們都增加數字。 ++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
但是,爲了回答實際問題,它們在典型的'for'循環用法的上下文中基本相同。 – Amber 2010-02-23 02:16:44
貞操點:'i = i + 1'是一個比'i'初始值多一個值的表達式,這會使它更像'++ i'。 – 2010-02-23 02:48:00
兩個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;)
請參閱TomH在David的回答中的ped,,i = i + 1與++ i相同,不是i ++ :-) – paxdiablo 2010-02-23 02:56:13
不同的是,該遞增運算符i++
返回i
像以前遞增是,和預先遞增運算符++i
回報i
,因爲它是後遞增。如果你問一個典型的for
循環:
for (i = 0; i < 10; i++)
或
for (i = 0; i < 10; ++i)
他們是完全一樣的,因爲你不使用i++
或++i
作爲一個更大的表達式的一部分。
兩者都將變量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
。
下面是一個示例類:
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 ++之間有區別,但不適用於循環。
for循環的方式進行處理是如下
1首先,進行初始化(I = 0)
2執行檢查(ⅰ< N)
3中的代碼循環被執行。
4中的值遞增
5重複步驟2 - 4
這就是爲什麼原因,存在和在for循環是,已經使用無差異之間我++ ++我。
這是我一直在尋找的答案。謝謝! – Chris 2015-03-24 20:45:06
JLS§14.14.1, The basic for Statement,清楚地表明,在ForUpdate表達式(多個)進行評估和的值(或多個)丟棄。其效果是在for
聲明的上下文中使兩個表單完全相同。
許多現有的實例。簡短的回答:對於本地類型沒有什麼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
相關:http://stackoverflow.com/questions/1756015/whats -i -i -in-php – jldupont 2010-02-23 02:19:25
++我理論上應該更有效率,因爲i ++只是一個++ i和一個副本(保存較早的值) 但是我想JVM會優化後者在for循環中(至少任何編譯器都可以......) - >沒有區別 – user3063349 2016-07-31 15:08:37