Java 与x2B之间的差异+;和+;1.

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

当我在while循环的最后一行使用
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
”。当然,我可能错了。