for 循环中的 i++ 和 ++i 有什么区别?

2022-09-01 16:19:58

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

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


答案 1

它们都会增加数字。 等效于 。++ii = i + 1

i++并且非常相似但不完全相同。两者都递增数字,但在计算当前表达式之前递增数字,而在计算表达式后递增数字。++i++ii++

int i = 3;
int a = i++; // a = 3, i = 4
int b = ++a; // b = 4, a = 4

答案 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++ 之间存在差异,但对于循环则没有差异。


推荐