【问题标题】:Difference between ++ and +1++和+1之间的区别
【发布时间】:2016-02-23 14:05:58
【问题描述】:

当我在 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;
    }

【问题讨论】:

  • 我不确定 Java 中的保证是什么,但“startIndex++”的意思是“增加 startIndex 并让表达式的值成为新值”,而在 C 中,你会“有罪”在没有中间序列点的情况下修改存储两次,从而导致未定义的行为。
  • var++ 与 var += 1 相同。+ 只是添加到变量中。

标签: java while-loop infinite-loop increment


【解决方案1】:

考虑会发生什么 - 如果 indexOf 失败,它会返回 -1。如果在那之后你有一个盲 startIndex++,那么你的 startIndex 将变为 0,循环将环绕,0 != -1 为 TRUE,继续循环。你会得到另一个-1,将它增加到0,然后你就开始了——搜索、失败、递增、循环/重复。

【讨论】:

  • 由于startIndex++ 在分配之前被评估,如果indexOf 失败,startIndex 将被设置为-1。然后 while 条件启动,循环结束。
  • 我以为他的意思是:“而不是startIndex + 1”。但我当然可能是错的。
【解决方案2】:

表达式startIndex++ 增加变量startIndex 的值,但它返回startIndex 的旧值。在评估包含startIndex++ 的表达式后,您将结果分配给startIndex。这意味着在您的情况下,增量被丢弃,startIndex++startIndex 将得到完全相同的结果:每次都会找到相同的事件,并且您有一个无限循环。

另一方面,表达式startIndex + 1 不会改变startIndex 的值,而是计算为startIndex 值后面的整数。现在indexOf 在找到的事件之后开始搜索,所以你没有无限循环。

【讨论】:

    猜你喜欢
    • 2022-10-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多