26

我刚刚开始学习 Java,现在我进入了 for 循环语句。我不明白for 循环是如何工作的++ii++

它们在加法和减法等数学运算中如何工作?

4

7 回答 7

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
于 2010-02-23T02:16:07.377 回答
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++ 之间存在差异,但 for 循环没有。

于 2010-02-23T02:36:58.207 回答
21

它们都将变量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

于 2010-02-23T02:18:54.180 回答
7

for循环的处理方式如下

1 首先进行初始化(i=0)

2 执行检查 (i < n)

3 循环中的代码被执行。

4 值递增

5 重复步骤 2 - 4

这就是为什么在已经使用的 for 循环中 i++ 和 ++i 没有区别的原因。

于 2010-02-23T03:18:55.533 回答
5

不同之处在于,后自增运算符按自增前的状态i++返回,而自增运算符按自增的状态返回。如果您要询问典型的循环:i++iifor

for (i = 0; i < 10; i++)

或者

for (i = 0; i < 10; ++i)

它们完全相同,因为您没有使用i++++i作为更大表达式的一部分。

于 2010-02-23T02:17:04.730 回答
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; )
于 2010-02-23T02:16:58.373 回答
0

JLS§14.14.1, The basic for Statement清楚地表明了ForUpdate表达式被评估并且值被丢弃。其效果是使两种形式在for语句的上下文中相同。

于 2010-02-23T04:13:11.007 回答