为啥变量 j 初始化不能在 for 循环的终止表达式中?

Posted

技术标签:

【中文标题】为啥变量 j 初始化不能在 for 循环的终止表达式中?【英文标题】:Why can't variable j initialization be in the termination expression of the for loop?为什么变量 j 初始化不能在 for 循环的终止表达式中? 【发布时间】:2018-10-09 07:36:02 【问题描述】:
public class Gameboard
      
    public char[][] board;
    public static void main(String args[])
    
        Gameboard blank = new Gameboard(false);
        System.out.println("Printing blank gameboard:\n" + blank + "\n");
    
    public Gameboard(boolean setup)
    
        char[][] board = new char[8][8];
        if (!setup)
        
            for(int i = 0; i < board.length;i++)
            
                for(int j = 0; j < board[j].length;j++)//critical condition
                
                    board[i][j] = '-';
                
            
        
    

我知道使用的列长度不是行长度,而是二维数组在行和列方面具有相同的长度。

【问题讨论】:

您可以尝试使用for (int j = 0; j &lt; board[i].length; j++) @Paul 抱歉,我的原始答案有点欠缺。刚刚在下面添加了更多细节,现在应该可以回答您的问题了。 @Paul 在您的新编辑中,以下行没有意义 char[][] board = new char[board.length][board.width];。首先,数组没有名为 width 的属性,因此 board.width 甚至无法编译。第二个板阵列尚未定义,因此当长度尚未设置时,您不能调用“board.length”。 【参考方案1】:

你的逻辑在这里不成立,因为i 计算第一个维度,j 计算第二个维度:你真正想要的是

for(int i = 0; i < board.length; i++)

    for(int j = 0; j < board[i].length; j++)
    
        board[i][j] = '-';
    

这个问题当然是在下面一行:

for (int j = 0; j < board[j].length; j++)

您使用j 作为板数组第一维的索引,但将其定义为最大长度等于第二维长度的值。这当然会让您面临索引超出范围的可能性,而这正是这段代码所产生的。

尽管两个维度相同,但您遇到问题的原因是因为 for 循环退出的条件会重新评估每个循环。

逻辑是:

j < board[j].length

所以在 7 时你会得到:

7 < board[7].length

等同于:

7 < 8

很好,它通过了,所以又经过了另一个循环,但是在 8 点会发生什么?

8 < board[8].length

Well 8 超出了 board 数组的范围,因此它会引发异常,它根本无法评估它。变量 i 但是永远不会达到 8,它会在 7 处停止,因此在这种情况下您永远不会得到超出范围的索引。

如果您执行以下操作,它会起作用(但不好的做法):

for(int j = 0; j < board[0].length; j++)

【讨论】:

我知道我计算的是 x 维度而不是 y。但是,board[i].length 与 board[j].length 不一样吗?那么是否应该产生相同的答案? @Paul 我更新了我的答案。它现在回答你的问题了吗?

以上是关于为啥变量 j 初始化不能在 for 循环的终止表达式中?的主要内容,如果未能解决你的问题,请参考以下文章

Java for 循环

for循环

Java 循环结构

C语言中的for循环

JavaScript学习系列博客_11_JavaScript中的for语句

for语句