Frage

Sorry, ich bin neu in Java, so dass diese Frage könnte unklar sein.

Ich habe mit umschließt einen Versuch und catch-Anweisung in einer while-Schleife vor kurzem zu tun, weil ich sicherstellen wollte, dass die Eingabe immer vom Rest des Programms eingeschlossen wurde.

Ich habe ein Problem entdeckt, wo die mit einem Ausrufezeichen (!) Vor einer Variablen in den währenden Bedingungen (zB während (! Done)) anstelle von = false (zB while (done = false)) ändert Art und Weise mein Programm ausgeführt wird.

Die ehemaligen (! Done) Ergebnisse im try und except-Anweisungen ausgeführt wird, wie erwartet. Letztere (done = false) nicht, sie einfach übersprungen und Bewegen auf den nächsten Teil des Codes.

Ich habe den Eindruck, dass! bevor eine Variable, die die gleiche Sache wie var gemeint = false.

Täusche ich mich?

Hier ist ein Beispiel:

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!");
    }
}

Derzeit Kompilieren und Ausführen des Programm glatt geht: es mir für eine Reihe aufgefordert wird, in einem Brief eingeben oder wirklich lange Zahl bewirkt, dass es aus dem Ausnahmetyp und Ausfahrt drucken. Typing in einer normalen Zahl bewirkt, dass es Erfolg drucken!

Auf der anderen Seite, wenn ich ersetzen war! InputDone mit inputDone = false, druckt es einfach aus Erfolg! wenn ich das Programm ausführen.

Kann mir jemand den Unterschied zu mir zwischen die erklären! und die = falschen Aussagen in einer while-Schleife?

War es hilfreich?

Lösung

Beachten Sie den Unterschied zwischen done = false und done == false. Die erste Abtretungs done false und bewertet wie false werden, die zweite vergleicht done mit false und ist genau identisch mit !done.

Also, wenn Sie verwenden:

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

Dann done wird auf false und der Code innerhalb der while-Schleife läuft nicht auf allen.

Andere Tipps

Die Aussage x = false ist eine Zuordnung - Sie x auf false setzen. Die Aussagen x == false und !x sind die gleichen, aber. Die Aussage x == false vergleicht x zu falsch und wird wahr sein, wenn der Wert von x ist falsch und falsch, wenn der Wert von x wahr ist. Die Aussage !x wird in der Negation des Wertes x zur Folge hat.

In Ihrem Code, wenn Sie while (!inputDone) mit while(inputDone == false) ersetzen, werden Sie das erwartete Verhalten bekommen.

Sie müssen == verwenden, anstatt = für Vergleiche.

"while (done = false)" ist gleich zu "done = false; while (erledigt)"

Es sollte als "während (done == false)" oder "während (false == getan)" geschrieben werden.

Aber trotzdem! Getan ist der lesbare Code, sagen Sie es „NICHT FERTIG“

Wie viele andere darauf hingewiesen, Sie haben typoed ==. Interessanter sind die Themen dieser Umgebung.

Für die Sprache entwickelt: Erfreuliche Nebenwirkungen in Ausdrücken sind schlecht. Mit dem Symbol == mathematische = darzustellen, ist keine gute Wahl.

In Bezug auf die Lesbarkeit, liest !done viel besser als done == false - wir wollen „nicht getan“ (besser, IMO, wäre „garen“ statt „während nicht getan“). Obwohl Neulinge schreiben den redundanten someCondition == true oft (ewige).

Es ist eine gute Idee, um Variablen final zu machen, obwohl sie eindeutig in dieser Situation nicht möglich. Wir können jedoch die Flagge ganz unter Verwendung einer break-Anweisung entfernen. Eine Minderheit Meinungen folgt Einzelnen Eintrag Einzel Exit (SESE) Regel, wonach break verboten ist, Whcih dieses Beispiel komplizierter machen würde (Sie einen Test benötigen würde, um zu sehen, ob der Text eine gültige int war, oder in diesem Fall bewegen sich die Körper in die Schleife.

Der Ausdruck:

x = false

bedeutet x den Wert false zuweisen.

Danach in Ihrem while() geschieht, dann wertet x, die false ist, damit es nicht die Schleife eintritt überhaupt.

Auf der anderen Seite:

while (!x)

bedeutet „solange! X wahr ist, auch weiterhin die Schleife eintritt“. da !x bedeutet „das Gegenteil von x“. Solange x falsch ist, wird die Schleife fortgesetzt

Andere Antworten haben darauf hingewiesen, dass das Schreiben x == false und x == true sind schlechter Stil. Es gibt drei Gründe:

  • Prägnanz: unter der Annahme, dass Sie in einem Kontext, wo ein boolescher erforderlich ist, und „x“ ist ein Boolean, es ist weniger Zeichen x als x == true zu schreiben, oder !x als x == false
  • .
  • Convention: erfahrene Programmierer in Java (oder C, C ++, C # und die meisten anderen Sprachen) erwarten eher zu sehen x als x == true und !x statt x == false
  • .
  • Robustheits: in Java die bedingten und Schleifenanweisungen erfordern alle ein boolescher Wert von Ausdruck in der Bedingung. Wenn y kein Boolean ist, dann wird ein Tippfehler in der Form if (y = foo) { einen Übersetzungsfehler in Java geben. Aber wenn y ein Boolean ist dann nicht if (y = foo) { kein Übersetzungsfehler geben. Somit kann durch == für Boolesche Werte zu vermeiden vermeiden Sie sich für eine ganze Reihe von Bugs Einstellung von Tippfehler zur Folge hat.

Viele haben darauf bereits Ihren Missbrauch von = vs. == aus. Ich möchte darauf hinweisen, dass eine statische Code-Analyse-Tool wie Findbugs würde dies sofort für Sie gefunden haben.

Siehe QBA: Methode ordnet boolean wörtlichen in boolean Ausdruck

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top