-5

私はここに座って、このコードがどのように実行されるかを理解しようとしています。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);
      }
}

これは基本的に、カード ピッキングの問題の 1 つです。私が混乱している部分は、while ループの最初の if ステートメントです。ループの前に、見つかったブール配列のすべてのスロットが false に設定されます。ただし、while ループの if ステートメントは、見つかったブール配列が true に設定されているかどうかをテストしており、true の場合は if ステートメントでコードを実行します。実行されるべきではありませんが、実行されます。そこにブレークポイントを設定すると、ブール配列スロットが false から true に変化して、if ステートメント内のコードが実行されることがわかりました。

私はこれがどのように起こっているのか真剣に理解していません。誰かが私にこれがどのように起こっているのか説明できますか?

ありがとうございました!

4

2 に答える 2

3

真かどうかをテストしているのではなく、偽かどうかをテストしています。この文:

!found[index / 13]

意味:

の位置を取り、found[]そうでないindex / 13かどうかをテストします。 true

!はブール補数であるため、値を反転します。found[index / 13]がである場合false!found[index / 13]trueであるため、ifステートメントが実行されます。

于 2012-12-18T04:44:41.590 に答える
2

if (!found[index / 13]) {

「このカードが見つからない場合」と読み替えてください。値が であるかどうかをチェックしています。その場合falseにのみ !found[..] が true になり、ifブロックが実行されるからです。

于 2012-12-18T04:44:25.080 に答える