我一直在假设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
。我的print语句显示else if
语句正在检查0位置,即使if
语句逻辑已满足。
我对if/elseif
逻辑流程的整个概念是不正确的?我的codeview即将破灭吗?
答案 0 :(得分:1)
我建议您不要在评论部分无限讨论此广告,而是在以下几点添加println
...
for
循环中的第一行(在您的第一个if之前)return false
之前 - 您显然需要使用{}
此图片应显示i
,boardCopy[i]
,length
此外,请添加else
块,println
显示相同的内容。
识别每个println
,以便了解正在打印的行(例如1:
2:
的前缀等)
我很确定输出会很有启发性:)
答案 1 :(得分: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 != 8
。当循环到达你的0时,你的i
的值设置为8.记住,在第一个循环中,i = 0。因此,使用blocks
。
答案 2 :(得分:1)
你的逻辑是有缺陷的:
如果我运行此代码,则会生成Out of order: 0, 9
,这是有效的if-else逻辑。
在i == 8
,第一个条件的计算结果为false,因为8 != 9 - 1
为false。
然后检查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;
}
}