【问题标题】:For Loops and Logical AND + OR [closed]For 循环和逻辑 AND + OR [关闭]
【发布时间】:2012-07-29 23:09:19
【问题描述】:

为什么这段代码不运行?

for(int i=0;i<11;i++){
    for(int j=0;j<11;j++){  

        if(i>0){
            if((staticWallLoc[i--][j]&4)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|1;}
        }
        if(j<10){
            if((staticWallLoc[i][j++]&8)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|2;}
        }
        if(i<10){
            if((staticWallLoc[i++][j]&1)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|4;}
        }
        if(j>0){
            if((staticWallLoc[i][j--]&2)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|8;}
        }

        System.out.println(i+" "+j);
    }
}

顺便说一下,staticWallLoc[11][11] 是一个二维数组,每个维度 (0-10) 有 11 个索引。

只是想知道为什么我的程序实际上无法通过此代码。

【问题讨论】:

  • 每次看到这样的问题我都感到困惑。您是否尝试过使用调试器??
  • 那些循环索引的增量和减量是可怕的!只需使用 i-1 和 i+1 等作为索引。
  • @John3136 我想你刚刚回答了这个问题;)
  • 看看at this thread 为什么不应该使用 i-- & i++ 索引。
  • 确实运行。它永远不会终止,因为你是这样写的。

标签: java arrays for-loop binary logical-operators


【解决方案1】:

老兄 - 你为什么在循环体中减少你用来控制循环计数器的相同变量?!?

听起来像是“前进一步,后退两步”,不是吗;)?

建议:

运行调试器,单步执行几次迭代,并仔细注意“i”和“j”会发生什么。

您认为其中一个或两个会在多长时间内达到“11”;)?

【讨论】:

  • +1,这是一些乱码。
【解决方案2】:

在您的if(i &gt; 0) 中,istaticWallLoc[i--] 递减。将其更改为staticWallLoc[i-1],并对j 执行相同操作。

if(i>0){
    // Try something like this instead
    if((staticWallLoc[i-1][j]&4)>0){
      staticWallLoc[i][j]=staticWallLoc[i][j]|1;
    }
}

您还需要将[i++] 更改为[i+1]

【讨论】:

  • 谢谢,我犯了一个非常非常愚蠢的错误,我只是习惯使用--和++,我是第一次程序员,所以这些愚蠢的错误很少,但我仍然犯了! XD 谢谢!
  • 没问题。像这样的错误提供了宝贵的经验。现在,当您阅读一本理论书籍时,您至少会受益于这个令人难忘的时刻,以更好地理解各种编程实践背后的推理等。
【解决方案3】:

在你的循环中,你有像if (i&gt;0) {staticWallLoc[i--][j]... 这样的语句。这些直接改变了循环索引。所以,当i1 时,它又改回0。当循环增加时,它会回到1,然后再次0,创建一个无限循环。

您的意思是使用staticWallLoc[i - 1][j]... 等吗?这会在不更改循环索引的情况下获得所需的索引。

【讨论】:

    【解决方案4】:

    不要在代码中使用 i++ i-- 等,只需使用偏移量 i-1 或 i+1。

    一般经验法则:在 for 循环中,不要弄乱主体内的 for 循环变量。

    (规则有例外,但这看起来不像例外)

    【讨论】:

      【解决方案5】:

      如果不知道数组的内容到底是什么,就很难说。可能是因为您正在使用--++ 动态修改i 和j 的值?您的意思是保持这些值不变并执行以下操作:

      if((staticWallLoc[i+1][j]&1)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|4;} // changed i++ to i+1
      

      【讨论】:

        【解决方案6】:

        一旦 j 达到 10,它不会在“if (j 0)”部分减少,因此 j 将在 9 处结束循环,然后通过循环管理增加回 10。因此,您将有一个无限循环,其中 i = -1/0(因为它在循环中递减和递增)和 j = 9/10(出于相同的原因)。

        【讨论】:

          【解决方案7】:

          如果一次 j >=10,则在最后一次执行 j--。循环将停留在 j==10。

          操纵循环变量不是一个好主意:)

          【讨论】:

            猜你喜欢
            • 2022-11-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多