3

申し訳ありませんが、私はJavaが初めてなので、この質問は不明確かもしれません。

入力の取得がプログラムの残りの部分から確実に取り囲まれるようにしたかったので、最近、while ループで try および catch ステートメントを囲む処理を行っています。

= false (例: while (done = false)) を使用する代わりに、while 条件 (例: while (!done)) で変数の前に感嘆符 (!) を使用すると、プログラムの方法が変わるという問題に遭遇しました。実行します。

前者 (!done) では、try および except ステートメントが期待どおりに実行されます。後者 (done = false) はそうではなく、単純にそれらをスキップしてコードの次の部分に進みます。

という印象を受けました!変数の前は、var = false と同じことを意味していました。

私は間違っていますか?

次に例を示します。

import java.util.Scanner;

public class TestOne {
    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);
        int num;
        boolean inputDone = false;
        while (!inputDone) {
            try {
                System.out.print("Enter in a number here: ");
                num = input.nextInt();
                inputDone = true;
            }
            catch (Exception e) {
                System.out.println(e);
                System.exit(0);
            }
        }
        System.out.println("Success!");
    }
}

現在のところ、プログラムのコンパイルと実行はスムーズに進みます。数字の入力を求めるプロンプトが表示され、文字または非常に長い数字を入力すると、例外の種類が出力されて終了します。通常の数値を入力すると、Success! と出力されます。

一方、!inputDone を inputDone = false に置き換えると、単に Success! と出力されます。プログラムを実行すると。

の違いを説明できる人はいますか ! while ループ内の = false ステートメントは?

4

8 に答える 8

17

と の違いに注意してdone = falseくださいdone == false。最初のものは に割り当て doneられ、falseとして評価されますfalse。2 番目のものは と比較doneされfalse、 とまったく同じです!done

したがって、次を使用する場合:

while (done = false)
{
 // code here
}

次にdoneが設定されfalse、while ループ内のコードはまったく実行されません。

于 2009-09-20T14:36:28.947 に答える
4

ステートメントx = falseは代入です - x を false に設定しています。ただし、ステートメントx == falseとステートメント!xは同じです。このステートメントx == falseは x を false と比較し、 の値が false の場合は true になり、 の値が true の場合xは false になりxます。このステートメント!xは、 の値の否定になりますx

コードを に置き換えるwhile (!inputDone)while(inputDone == false)、期待どおりの動作が得られます。

于 2009-09-20T14:36:13.697 に答える
3

比較==の代わりに使用する必要があります。=

于 2009-09-20T14:37:53.007 に答える
2

他の多くの人が指摘しているように、あなたはタイプミスしまし==た。さらに興味深いのは、これを取り巻く問題です。

設計された言語の場合:式の副作用を助長することは悪いことです。記号==を使用して数学を表す=ことは適切な選択ではありません。

読みやすさの点では、読みやすさは「未完了」!doneよりもはるかに優れていますdone == false(IMOは、「未完了」ではなく「完了まで」になります)。(永続的な)初心者はしばしば冗長なを書きますがsomeCondition == true

finalこの状況では明らかに実行可能ではありませんが、変数を作成することをお勧めします。ただし、breakステートメントを使用してフラグを完全に削除できます。少数派の意見は、シングルエントリシングルエグジット(SESE)ルールに従ってbreak禁止されていますが、この例はよりトリッキーになります(テキストが有効かどうかを確認するためのテストが必要ですint。この場合は、本文をに移動します。ループ。

于 2009-09-20T16:19:07.527 に答える
2

表現:

x = false

x値を割り当てることを意味しますfalse

これが で発生した後while()、 を評価します。xこれはfalse、ループに入らないようにするためです。

一方で:

while (!x)

「!x が true である限り、ループに入り続ける」ことを意味します。since!xは「x の反対」を意味します。false である限りx、ループは継続します。

于 2009-09-20T14:37:25.623 に答える
2

"while(done = false)" は "done=false; while(done)" と同じです

「while(done == false)」または「while(false == done)」と記述します。

それでも、 !done は最も読みやすいコードであり、「NOT DONE」と表示されます

于 2009-09-20T14:37:47.417 に答える
1

x == false他の回答は、ライティングとx == trueスタイルが悪いという事実をほのめかしています。これには 3 つの理由があります。

  • 簡潔さ: ブール値が必要なコンテキストにいて、「x」がブール値であると仮定すると、、またはxよりも書く文字数が少なくなります。x == true!xx == false
  • 慣習: Java (または C、C++、C#、およびその他のほとんどの言語) の経験豊富なプログラマーは、ではxなくx == true、 および.!xx == false
  • 堅牢性: Java では、条件付きステートメントとループ ステートメントはすべて、条件にブール値の式を必要とします。yがブール値でない場合、フォームのタイプミスにより、 if (y = foo) {Java でコンパイル エラーが発生します。しかしy、ブール値の場合if (y = foo) {、コンパイル エラーは発生しません。したがって、==ブール値を回避することで、タイプミスに起因する大量のバグを回避できます。
于 2009-09-21T07:04:01.783 に答える
0

=多くの人があなたのvs.の誤用をすでに指摘しています==Findbugsのような静的コード分析ツールを実行すると、すぐにこれが見つかることを指摘したいと思います。

QBAを参照してください: メソッドはブール式でブール値リテラルを割り当てます

于 2012-05-24T21:01:15.157 に答える