可能重复:
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