Java 与x2B之间的差异+;和+;1.
当我在while循环的最后一行使用Java 与x2B之间的差异+;和+;1.,java,while-loop,infinite-loop,increment,Java,While Loop,Infinite Loop,Increment,当我在while循环的最后一行使用startIndex++时,它导致了一个无限循环,但是使用startIndex++1,程序运行良好。我想知道为什么会这样 public static int numOccurrences(String src, String q) { int startIndex = src.indexOf(q); int counter = 0; while (startIndex != -1) {
startIndex++
时,它导致了一个无限循环,但是使用startIndex++
1,程序运行良好。我想知道为什么会这样
public static int numOccurrences(String src, String q) {
int startIndex = src.indexOf(q);
int counter = 0;
while (startIndex != -1) {
counter++;
startIndex = src.indexOf(q, startIndex + 1);
}
return counter;
}
考虑发生了什么-如果
indexOf
失败,它将返回-1
。如果在此之后有一个盲startIndex++
,那么startIndex将变成0
,循环将环绕,并且0!=-1
为真,继续循环。您将得到另一个-1
,将其递增到0
,然后在您周围搜索、失败、递增、循环/重复。表达式startIndex++
递增变量startIndex
的值,但它返回startIndex
的旧值。计算包含startIndex++
的表达式后,将结果分配给startIndex
。这意味着在您的情况下,增量被丢弃,startIndex++
和startIndex
将产生完全相同的结果:每次都会找到相同的事件,并且您有一个无限循环
另一方面,表达式
startIndex+1
不会更改startIndex
的值,而是计算为startIndex
值后面的整数。现在,indexOf
在找到的事件后开始搜索,因此您没有无限循环。我不确定Java中的保证是什么,但“startIndex++”表示“增量startIndex,让表达式的值成为新值”,在C中,您将“有罪”在没有中间序列点的情况下修改一个存储器两次,从而导致未定义的行为。var++与var+=1相同只是添加到变量中。由于startIndex++
是在赋值之前计算的,因此如果indexOf
失败,startIndex
将设置为-1
。然后while条件开始,循环结束。我想他的意思是:“而不是startIndex+1
”。当然,我可能错了。