0

我一直在假设if ... else if语句被短路的情况下进行编程。也就是说,如果一个条件满足该if语句,则该else if语句不会被访问。我的一个程序中最近的行为使这一点受到质疑。下面是代码,它遍历一个数组并检查数组中的每个值是否与其索引 +1 匹配:

        int[] boardCopy = this.getBoard();
        int length = boardCopy.length;
        for (int i = 0; i < length; i++) {
            //blank space must be in last position
            if (boardCopy[i] == 0 && i != length -1) return false;
            //out of order if value does not match index + 1 (zero indexed)
            else if (boardCopy[i] != i +1) {
                System.out.println("Out of order: " + boardCopy[i] + ", " + (i+1));
                return false;
            }
        }
        return true;

这是我正在测试的数组:

int[] blocks = {1, 2, 3, 4, 5, 6, 7, 8, 0};

当我创建一个有序的板时(值匹配索引 + 1 并且 0 在最后一个位置),它返回false. 我的打印语句显示该else if语句正在检查 0 位置,即使if语句逻辑已满足。

我对if/elseif逻辑流程的整个概念不正确吗?我的代码视图会被打破吗?

4

3 回答 3

1

我建议不要在评论部分讨论这个广告,而是println在以下几点添加...

  • for循环中的第一行(在你的第一个 if 之前)
  • 在第一个之前return false- 你显然需要用{}

此打印应显示i, boardCopy[i],的值length

此外,包括一个显示相同的最终else块。println

识别每个println,以便您知道正在打印哪一行(例如前缀1: 2:等)

我很确定输出会很有启发性:)

于 2013-03-05T14:23:54.667 回答
1
if (boardCopy[i] == 0 && i != length -1) return false;
    //out of order if value does not match index + 1 (zero indexed)
    else if (boardCopy[i] != i +1) {
        System.out.println("Out of order: " + boardCopy[i] + ", " + (i+1));
        return false;
    }
    return true;
}

您在以下位置运行上述代码:

int[] blocks = {1, 2, 3, 4, 5, 6, 7, 8, 0};

这意味着length = 9

现在,当您遍历这些数字时,您的第一个 if 语句将不会阻塞,直到您达到 0。您的 if 语句的第一个条件是True。第二个是:i != length -1,或者更好的说法是:i != 8i当循环到达 0 时,您的值设置为 8。请记住,在第一个循环中,i=0 。因此,您的 if 语句对于您的集合将始终为真blocks

于 2013-03-05T14:24:04.023 回答
1

您的逻辑有缺陷:如果我运行此代码,它会产生Out of order: 0, 9,这是有效的 if-else 逻辑。

i == 8第一个条件评估为假,因为8 != 9 - 1是假的。

然后检查 else 子句,因为board[8] != 9,你得到“乱序”。

我想你想要

    for (int i = 0; i < length; i++) {
        //blank space must be in last position
        if (boardCopy[i] == 0) {
            if (i != length -1) {
                return false;
            }
            continue;   // can be in an else block or omitted
        }
        //out of order if value does not match index + 1 (zero indexed)
        else if (boardCopy[i] != i +1) {
            System.out.println("Out of order: " + boardCopy[i] + ", " + (i+1));
            return false;
        }
    }
于 2013-03-05T14:24:15.230 回答