for循环中的i++和++i有啥区别? [复制]
Posted
技术标签:
【中文标题】for循环中的i++和++i有啥区别? [复制]【英文标题】:What is the difference between i++ & ++i in a for loop? [duplicate]for循环中的i++和++i有什么区别? [复制] 【发布时间】:2011-01-19 22:01:43 【问题描述】:我刚刚开始学习 Java,现在我正在学习 for 循环语句。我不明白 ++i
和 i++
在 for 循环中的工作原理。
它们在加法和减法等数学运算中是如何工作的?
【问题讨论】:
许多现有实例。简短的回答:对于本机类型什么都没有。 ***.com/questions/484462/…***.com/questions/1941391/… 和许多其他取自***.com/search?q=i%2B%2B+%2B%2Bi 相关:***.com/questions/1756015/… ++i 在理论上应该更有效,因为 i++ 只是一个 ++i 和一个副本(以保存早期的值)但我猜 JVM 会在 for 循环中优化后者(至少任何编译器会做......) - >没有区别 【参考方案1】:他们都增加了数字。 ++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
循环使用的上下文中基本相同。
学究点:i = i + 1
是一个值比i
的初始值大一的表达式,这将使它更像++i
。【参考方案2】:
这是一个示例类:
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++ 之间存在差异,但 for 循环没有。
【讨论】:
+1 表示加倍努力。 不是循环在做它,而是它不在更大的表达式上下文中。如果你的循环结束表达式更复杂,它很可能会有所作为。 我将在循环示例中添加更多内容并再次尝试查看。 这个答案绝对+1! ...虽然它可以在以下情况下有所不同:“for (int i = 0, int j = 0; i 【参考方案3】:它们都将变量i
加一。这就像说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
。
【讨论】:
【参考方案4】:for循环的处理方式如下
1 首先进行初始化(i=0)
2 执行检查 (i
3 循环中的代码被执行。
4 值递增
5 重复步骤 2 - 4
这就是为什么在已经使用的for循环中i++和++i没有区别的原因。
【讨论】:
这是我一直在寻找的答案。谢谢!【参考方案5】:区别在于后自增运算符i++
返回i
,因为它是之前自增,而前自增运算符++i
返回i
,因为它是在递增之后。如果您询问的是典型的 for
循环:
for (i = 0; i < 10; i++)
或
for (i = 0; i < 10; ++i)
它们完全相同,因为您没有使用 i++
或 ++i
作为更大表达式的一部分。
【讨论】:
【参考方案6】: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 的迂腐,i=i+1 等同于 ++i,而不是 i++ :-)【参考方案7】:JLS§14.14.1, The basic for Statement,清楚地表明 ForUpdate 表达式已被评估并且值被丢弃。效果是在for
语句的上下文中使这两种形式相同。
【讨论】:
以上是关于for循环中的i++和++i有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章