2010-02-23 131 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

相关问题