-4

为什么这段代码不运行?

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 个索引。

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

4

7 回答 7

2

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

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

建议:

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

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

于 2012-07-29T23:14:19.810 回答
1

在你的if(i > 0),i被递减staticWallLoc[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].

于 2012-07-29T23:17:08.843 回答
0

在您的循环中,您有类似if (i>0) {staticWallLoc[i--][j].... 这些直接改变了循环索引。所以,当i是时1,它会变回0。当循环增加时,它会回到1,然后0再次创建一个无限循环。

你也许是想说使用staticWallLoc[i - 1][j]...等?这会在不更改循环索引的情况下获得所需的索引。

于 2012-07-29T23:15:58.767 回答
0

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

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

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

于 2012-07-29T23:16:00.010 回答
0

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

if((staticWallLoc[i+1][j]&1)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|4;} // changed i++ to i+1
于 2012-07-29T23:16:38.540 回答
0

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

于 2012-07-29T23:17:20.517 回答
0

如果有一次 j >=10,你最后做一个 j--。循环将停留在 j==10。

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

于 2012-07-29T23:17:55.653 回答