【问题标题】:Java: trouble with i++ [duplicate]Java:i ++的麻烦[重复]
【发布时间】:2017-01-11 07:53:54
【问题描述】:

我无法理解为什么部分代码会运行:

private int m;
private int n;

public void f() {
    m = (m +2) % n;
    System.out.print(m+"\n");
}

public void g() {
    int i=0;
    m=0;
    n=8;
    while (i++<n) {
        System.out.print("i=" + i + " m=");
        f();
    }
}

如果我运行g(),我会打印出以下内容:

i++=1 m=2
i++=2 m=4
i++=3 m=6
i++=4 m=0
i++=5 m=2
i++=6 m=4
i++=7 m=6
i++=8 m=0

据我了解,最后一行不应出现。为什么f() 上次得到那个?

f() 第一次被调用时,i = 0i++ = 1。 (所以当我打印i时,它已经等于1)。

当我倒数第二次调用f() 时,i = 6,然后是i++ = 7。这是最后一个完整的 &lt; n ( n = 8 )。

i++ 已经是= 8 时,为什么要再次调用该函数?这真的让我很困惑。

【问题讨论】:

  • 你知道i++++i的区别吗?如果没有,请研究一下,然后您就会知道为什么您的代码会这样工作。
  • 怎么可能收到这样的输出?无法复制!
  • @xenteros ideone.com/jr9QDr
  • @xenteros 只需将打印语句更改为: System.out.print("i++= " + i + " m=")
  • @Tom 别担心,没有标记

标签: java while-loop compare


【解决方案1】:

试试++i 而不是i++

这与以下事实有关:

  • ++i 表示“增加 i 并将结果数字返回给下一个要处理的运算符。” (预增量)
  • i++ 的意思是“将 i 的值返回到下一个操作,并在你这样做之后增加 i。” (后增量)

【讨论】:

  • 在许多编码风格中,在语句中使用++ 是不好的做法,因为它会造成混乱。 (值得注意的例外可能是array[i++] 的数组迭代)
  • 是的,我也不喜欢混淆增量和比较。特别是当括号也会掩盖差异时(如果 i++ 在括号中,OP 就不会注意到)。我明白为什么类 C 语言有这个(通常有一个不远的汇编结构),但是很糟糕。
【解决方案2】:

这是因为 i++ 是后增量。这意味着它在与 n 比较后递增。如果要在与 n 比较之前增加 i,则必须使用 ++i

【讨论】:

    【解决方案3】:

    当你有:

    while(i++<n){
    ...
    }
    

    就好像你会:

    while(i<n){
    i++;
    ...
    }
    

    值首先被使用,然后递增。

    如果您希望该值首先递增,然后用于评估条件,您只需使用以下代码:

    while(++i<n){
    ...
    }
    

    请注意,这不仅适用于 while,而且适用于 if、for、do-while 和任何其他对变量的内联评估。

    【讨论】:

    • 你能描述一下有什么不同吗?
    【解决方案4】:

    使用++i 代替i++

    • i++ 创建一个副本,增加 i,然后返回副本,所以它会 返回 i 的旧值(后增量)。

    • ++i 增加 i,并返回 i,更新后的值(预增量)。

    因此,当您检查条件 i++&lt;n 时,它会使用旧值进行检查,因此条件被评估为 true。

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2016-05-11
      相关资源
      最近更新 更多