Was ist der Unterschied zwischen while (x = false) und während (! X) in Java?
-
12-09-2019 - |
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?
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
alsx == true
zu schreiben, oder!x
alsx == false
.
- Convention: erfahrene Programmierer in Java (oder C, C ++, C # und die meisten anderen Sprachen) erwarten eher zu sehen
x
alsx == true
und!x
stattx == 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 Formif (y = foo) {
einen Übersetzungsfehler in Java geben. Aber wenny
ein Boolean ist dann nichtif (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