i ++和++ i for for循环(Java)有什么区别?

use*_*330 26 java

可能的重复:
循环中i ++和++ i之间的区别?
java中的x ++和++ x有区别吗?

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

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

Dav*_*one 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
Run Code Online (Sandbox Code Playgroud)

  • 然而,要回答实际问题,它们在典型的`for`循环使用的上下文中基本相同. (14认同)

duf*_*ymo 44

这是一个示例类:

public class Increment
{
    public static void main(String [] args)
    {
        for (int i = 0; i < args.length; ++i)
        {
            System.out.println(args[i]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我使用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

}
Run Code Online (Sandbox Code Playgroud)

如果我改变循环所以它使用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

}
Run Code Online (Sandbox Code Playgroud)

当我比较两者时,TextPad告诉我两者是相同的.

这说的是从生成的字节代码的角度来看,循环没有区别.在其他情况下,++ i和i ++之间存在差异,但不适用于循环.

  • +1加倍努力. (9认同)

Jav*_*ier 21

它们都将变量增加i一.这就像说i = i + 1.差异很微妙.如果你在这样的循环中使用它,那就没有区别了:

for (int i = 0; i < 100; i++) {
}

for (int i = 0; i < 100; ++i) {
}
Run Code Online (Sandbox Code Playgroud)

如果您想了解其中的区别,请查看以下示例:

int a = 0;
int b = a++; // b = 0; a = 1

a = 0;
b = ++a: // b = 1; a = 1
Run Code Online (Sandbox Code Playgroud)

我们的想法是++a递增a并返回该值,同时a++返回一个值,然后递增a.


jav*_*eek 7

处理循环的方式如下

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

2执行检查(i <n)

3执行循环中的代码.

4值递增

5重复步骤2 - 4

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


Car*_*rum 5

所不同的是,递增运算符i++的回报i,因为它是之前递增,且预先递增运算符++i的回报i,因为它是递增.如果你问一个典型的for循环:

for (i = 0; i < 10; i++)
Run Code Online (Sandbox Code Playgroud)

要么

for (i = 0; i < 10; ++i)
Run Code Online (Sandbox Code Playgroud)

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