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 = 0
和i++ = 1
。 (所以当我打印i
时,它已经等于1
)。
当我倒数第二次调用f()
时,i = 6
,然后是i++ = 7
。这是最后一个完整的 < 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++<n
时,它会使用旧值进行检查,因此条件被评估为 true。
【讨论】:
以上是关于Java:i ++的麻烦[重复]的主要内容,如果未能解决你的问题,请参考以下文章