我一直坐在这里试图围绕这段代码的运行方式。我理解(或者我认为我理解)布尔运算符如何在if语句中工作,但显然我没有。代码是:
public class Exercise_6_24 {
public static void main(String[] args) {
final int NUMBER_OF_CARDS = 52;
String[] suits = {"Clubs", "Diamonds", "Hearts", "Spades"};
String[] ranks = {"Ace", "2", "3", "4", "5", "6", "7", "8", "9",
"10", "Jack", "Queen", "King"};
// found indicates whether a suit has been picked
boolean[] found = new boolean[4];
// Count the number of picks
int numberOfPicks = 0;
// Count occurrence in each suit
int count = 0;
while (count < 4) {
numberOfPicks++;
int index = (int)(Math.random() * NUMBER_OF_CARDS);
if (!found[index / 13]) {
found[index / 13] = true;
count++;
String suit = suits[index / 13];
String rank = ranks[index % 13];
System.out.println(rank + " of " + suit);
}
}
System.out.println("Number of picks: " + numberOfPicks);
}
}
这基本上就是选卡问题之一。我感到困惑的部分是while循环中的第一个if语句。在循环之前,找到的布尔数组中的所有槽都设置为false。然而,while循环中的if语句测试找到的boolean数组是否设置为true,如果为true,则运行if语句中的代码。它不应该运行,但确实如此。当我在那里设置断点时,我看到布尔数组槽从false变为true,以使if语句中的代码运行。
我真的不明白这是怎么回事。有人可以向我解释这是怎么回事吗?
谢谢!
答案 0 :(得分:3)
你没有测试它是否属实,你正在测试它是否是假的。这句话:
!found[index / 13]
意思是:
在
found[]
处取index / 13
的位置,并测试它是否true
。
!
是布尔补码,因此它会反转该值。如果found[index / 13]
为false
,则!found[index / 13]
为true
,因此if
语句将会运行。
答案 1 :(得分:2)
if (!found[index / 13]) {
将此读为“如果此卡不找到”。它正在检查值是否为 false
,因为只有这样才会找到[..]为真,并且if
块将会执行。