【问题标题】:using "i++" in a for loop在 for 循环中使用“i++”
【发布时间】:2010-11-27 17:15:12
【问题描述】:

嗨 我有一个问题,我可以使用这样的代码:

        if (low != mid && mid != high) {
        for (int i = 0; i <= mid; i++) {
            boolean bool = Determinate.isPointLeftSide(a, auxiliaryListTwo.get(i), auxiliaryListTwo.get(i + 1));
            if (bool == false) {
                p = auxiliaryListTwo.get(i);

            } else {
                boolean bool1 = Determinate.isPointRightSide(a, auxiliaryListTwo.get(i + 1), auxiliaryListTwo.get(i));
                boolean bool2 = Determinate.isPointRightSide(a, auxiliaryListTwo.get(i + 1), b);
                if (bool1 == true && bool2 == true) {
                    p = auxiliaryList.get(i + 1);
                }
                else{
                    i++;
                }
            }

        }

    }

我在else部分使用了“i++”,对吗?

【问题讨论】:

    标签: java for-loop


    【解决方案1】:

    基本规则是不要在循环内以任何方式更改计数器变量(此处为i)。如果你想跳过当前的迭代,你应该使用continue; 语句。

    【讨论】:

    • +1:i++; 声明是不好的做法,肯定会通往维护地狱。
    【解决方案2】:

    对吗?

    如果想让代码有i = i +1的效果,那就对了。由于您已经在 for 语句中增加 i,如果达到 else,i 将增加两次。只要您在代码中分析了这一点的含义,就应该没问题。在您的情况下,您不必担心越界问题,因为如果 i&lt;=mid 并且在 i++ 之后没有代码,则顶部的循环将终止。但是,当达到 i++ 时,循环将永远不会针对 i 的某些值运行,因为它有效地跳过了一次迭代。

    这里是您的代码的快速重构,以删除无用的变量。为了最清楚起见,您应该将变量放回原处,但使用更多信息变量名称,例如boolean isAToTheLeftOfB = ***。评论是你的朋友!!

    package example;
            if (low != mid && mid != high) {
            for (int i = 0; i <= mid; i++) {
                if ( ! Determinate.isPointLeftSide(a, auxiliaryListTwo.get(i), auxiliaryListTwo.get(i + 1))) {
                    p = auxiliaryListTwo.get(i);
    
                } else {
                    if ( Determinate.isPointRightSide(a, auxiliaryListTwo.get(i + 1), auxiliaryListTwo.get(i)) && Determinate.isPointRightSide(a, auxiliaryListTwo.get(i + 1), b) ) {
                        p = auxiliaryList.get(i + 1);
                    }
                    else{
                        i++;
                    }
                }
            }
        }
    

    编辑:感谢Vladimir 指出您应该使用continue statement 而不是直接递增计数器。这肯定更清晰,更不容易出错。

    【讨论】:

      【解决方案3】:

      我可以提供一些风格提示吗?

      尽量不要使用双重否定。例如

      if not condition
        task for false
      else 
        task for true
      

      这可能很难阅读。说的更清楚了

      if condition
        task for true
      else 
        task for false
      

      这样说也不正常:

      if (bool == false)
        do something
      

      我们通常说

      if !bool
        do something
      

      我们不会使用名为 bool 的变量,而是根据用途命名。例如

      boolean isLeftSide = Determinant....
      

      【讨论】:

        【解决方案4】:

        没有特别评论您的代码,但这样做感觉不对。在 i 为您递增的意义上,for 循环是自我管理的。当您还操纵 i 的值时,结果很难预测。当你这样做时,你可能会发现自己脱离了集合的边缘。

        【讨论】:

        • 我同意操纵 i 值不是最好的主意,它可以超越集合的边缘,但在他的情况下,没有什么可担心的。由于 i++ 位于代码的最后,它实际上只是跳过了一次迭代。接下来发生的事情是检查 i 是否仍在可接受的范围内。
        【解决方案5】:

        您可能想使用while 循环,让事情看起来更合乎逻辑。这是完全合法的,但不是一种“好”的编码方式。

        【讨论】:

          【解决方案6】:
          `for (int i = 0; i <= mid; i++)
          

          如果它的 true 或 false 已经增加,所以如果你在 else 中再次使用它会增加两次

          【讨论】:

            猜你喜欢
            • 2011-05-14
            • 1970-01-01
            • 2015-07-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多