可能重复:
Difference between i++ and ++i in a loop?
Is there a difference between x++ and ++x in java?
你好,我刚刚开始学习Java,现在我正在进行循环语句。我不明白++ i i ++在for循环语句中是如何工作的。
我的意思是他们如何在数学运算中工作,如加法和减法。我希望有人会向我解释这一点。
答案 0 :(得分: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
答案 1 :(得分: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
}
如果我更改循环以便它使用i ++并再次反汇编,我会得到:
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 ++之间存在差异,但不适用于循环。
答案 2 :(得分: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
。
答案 3 :(得分:7)
处理循环的方式如下
1首先,执行初始化(i = 0)
2执行检查(i 3执行循环中的代码。 4值递增 5重复步骤2 - 4 这就是为什么i ++和++ i在已经使用的for循环中没有区别的原因。
答案 4 :(得分:5)
不同之处在于后增量运算符i++
返回i
,因为它是增量之前的,并且预增量运算符++i
返回{{在递增之后它是。如果您询问典型的i
循环:
for
或
for (i = 0; i < 10; i++)
它们完全相同,因为您没有使用for (i = 0; i < 10; ++i)
或i++
作为更大表达式的一部分。
答案 5 :(得分: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; )
答案 6 :(得分:0)
JLS§14.14.1, The basic for Statement,明确表示 ForUpdate 表达式已被评估且值被丢弃。其效果是在for
语句的上下文中使两个表单相同。