i ++&和i ++之间的区别是什么? ++我在for循环(Java)?

时间:2010-02-23 02:13:22

标签: java

  

可能重复:
  Difference between i++ and ++i in a loop?
  Is there a difference between x++ and ++x in java?

你好,我刚刚开始学习Java,现在我正在进行循环语句。我不明白++ i i ++在for循环语句中是如何工作的。

我的意思是他们如何在数学运算中工作,如加法和减法。我希望有人会向我解释这一点。

7 个答案:

答案 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语句的上下文中使两个表单相同。