【问题标题】:What is the difference between i++ & ++i in a for loop? [duplicate]for循环中的i++和++i有什么区别? [复制]
【发布时间】:2011-01-19 22:01:43
【问题描述】:

我刚刚开始学习 Java,现在我正在学习 for 循环语句。我不明白 ++ii++ 在 for 循环中的工作原理。

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

【问题讨论】:

标签: java increment


【解决方案1】:

他们都增加了数字。 ++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

【讨论】:

  • 然而,为了回答实际问题,它们在典型的 for 循环使用的上下文中基本相同。
  • 学究点:i = i + 1 是一个值比i 的初始值大一的表达式,这将使它更像++i
【解决方案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++ 之间存在差异,但 for 循环没有。

【讨论】:

  • +1 表示加倍努力。
  • 不是循环在做它,而是它不在更大的表达式上下文中。如果你的循环结束表达式更复杂,它很可能会有所作为。
  • 我将在循环示例中添加更多内容并再次尝试查看。
  • 这个答案绝对+1! ...虽然它可以在以下情况下有所不同:“for (int i = 0, int j = 0; i
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    for循环的处理方式如下

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

    2 执行检查 (i

    3 循环中的代码被执行。

    4 值递增

    5 重复步骤 2 - 4

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

    【讨论】:

    • 这是我一直在寻找的答案。谢谢!
    【解决方案5】:

    区别在于后自增运算符i++返回i,因为它是之前自增,而前自增运算符++i返回i,因为它是递增之后。如果您询问的是典型的 for 循环:

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

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

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

    【讨论】:

      【解决方案6】:

      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; )
      

      【讨论】:

      • 在大卫的回答中看到 TomH 的迂腐,i=i+1 等同于 ++i,而不是 i++ :-)
      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 2017-05-17
        • 2014-01-24
        • 1970-01-01
        • 2017-10-23
        • 2013-05-22
        • 1970-01-01
        • 2011-01-24
        相关资源
        最近更新 更多