1

クラス プロジェクトの最後の仕上げを行っており、ユーザー入力の 1 つにセーフティ ネットを追加しています。ユーザーが「1」または「2」を入力すると、入力したデータが異なる方法で表示されるように設定しました。ユーザーが「1」または「2」以外を入力できないようにするメソッドを追加したい。これがそのコードです。

do
{
System.out.println("Please type either '1' or '2'.");
Scanner scan = new Scanner(System.in);
a = scan.nextInt();
}
while (a != (1||2));
//after user enters 1 or 2, return the choice
return a;

オペランドとロジックについて読んでいますが、ちょっと行き詰まっています。私はずっと先生にバッジをつけていたので、私は彼の唯一の生徒ではないので、彼に休憩を与えることにしました. 私のエラーは、「二項演算子 '||' のオペランドの型が正しくありません。

4

8 に答える 8

7

これは、プログラミングを学ぶときによくある誤解です。

人間として、「while a is not 1 or 2」のようなステートメントを簡単に読むことができますが、コンピューターは特定の規則に従わなければならず、その規則の 1 つは「または」が優先されるというものです。

これが意味することは、最初に「1または2」が何を意味するかを理解しようとすることです。基本的に、ステートメントは次のようになるためです。

while (a != SOMETHING);

||(演算子と呼ばれる) の両側にある 2 つの値 (オペランドと呼ばれる) を取り、||「論理 OR」の規則に従ってそれらを結合します。

「論理和」は 2 つのブール値を使用しますが、これは True または False のみであり、数値で演算子を使用するように要求したため、その特定のエラー メッセージが表示されます。

単一のパイプ を使用しようとした場合|、コンパイラは文句を言うのをやめたかもしれませんが、それでもやりたいことを実行しません。

1 or 2数値を扱う場合|、「ビット単位の OR」演算子である演算子を使用すると、2 つの数値を組み合わせて数値 3 を作成できます。理由を知りたい場合は、「ビット単位の演算子」について詳しく読むことができます。

つまり、このように比較を書くことはできません。

プログラミング言語では、比較は一度に 2 つの値で行われます。したがって、唯一の選択肢は、式を展開して 2 回比較することです。

必要なものを提供する同等の式を次に示します。

while (a != 1 && a != 2);

またはこれ:

while (!(a == 1 || a == 2));

正直なところ、私は最初の方が好きです。

于 2013-02-23T21:09:53.467 に答える
0

それは(a != 1 && a!=2)- a が 1 または 2 のときに実際にループを終了したいということです。

于 2013-02-23T21:04:40.610 に答える
0

と に対して個別の条件ステートメントを実行する必要がありa!= 1ますa!= 2

条件ステートメントは次のようになります。

(a!=1) && (a!=2)
于 2013-02-23T21:04:44.337 に答える
0

ここでの問題は、英語として読めば意味のあるコードを書こうとしているのに、そのようには機能しないことです。演算子は 2 つの式を取り、||どちらかが である場合に返しますtrue。つまり、あなたの書いたものには意味がないということです。

これを置き換える最も簡単な方法は、展開することです。

a != 1 && a != 2

&&どちらも真でないことを確認しているので、使用する必要があります)。

これは冗長で厄介になる可能性があることに注意してください。または、(確認する値がたくさんある場合) 適切な代替手段は、コレクション内のメンバーシップ チェックですSet(O(1) メンバーシップ テストが保証されているため、a を選択することをお勧めします)。例えば:

Set<Integer> possibles = new HashSet<Integer>();
Collections.addAll(possibles, new Integer[] {1, 2, ...});
while (!possibles.contains(a)) {
    ...
于 2013-02-23T21:04:54.557 に答える
0

のように扱うことはできませんintpseudo- regex。交換

while (a != (1||2));

while (a != 1 && a!= 2);
于 2013-02-23T21:04:58.573 に答える
0

whileループ条件でこれを試してください

((a!=1) && (a!=2))
于 2013-02-23T21:05:20.327 に答える
0

あなたは書く必要があります

while (a != 1 && a != 2)

それはnotと同等だからです (a == 1 || a == 2)

于 2013-02-23T21:05:34.773 に答える
0

二項演算子 '||' 両側に 2 つのブール オペランドが必要です。オペランドが整数であるため、これは構文エラーです。

次のようにする必要があります。

do{
// core of the loop...
}while(a!=1 && a!=2);
于 2013-02-23T21:09:31.180 に答える