Java:i ++的麻烦[重复]

Posted

技术标签:

【中文标题】Java:i ++的麻烦[重复]【英文标题】:Java: trouble with i++ [duplicate] 【发布时间】: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 别担心,没有标记 【参考方案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。

【讨论】:

以上是关于Java:i ++的麻烦[重复]的主要内容,如果未能解决你的问题,请参考以下文章

java中的递减和赋值运算符[重复]

java刷题--26删除有序数组中的重复项

java 中StringBuffer 去重复值

java-stream的map方法中的i++ [重复]

JAVA怎么实现从指定范围随机取不重复的6个数字

Java初学者-转义序列[重复]