2010-03-06 6 views
10

Ich weiß, dass wir keinen Zuweisungsoperator in if-Anweisungen in Java verwenden können, wie wir es in anderen Sprachen verwenden.Durch Verwechslung mit == und = in "if" -Anweisung

die

  int a; 

      if(a = 1) { } 

ist ein Übersetzungsfehler geben.

aber der folgende Code funktioniert gut, wie?

EDIT: Ist dies die Ausnahme zu Regel diese Zuordnung kann nicht in If-Anweisung verwendet werden.

+6

Es ist keine schlechte Idee, die Gewohnheit zu bekommen, dass die Konstante zunächst setzen in Ihrer if-Anweisungen .... ist: wenn (true == b) {} und if (1 == a) { } Diese Gewohnheit garantiert, dass der Compiler Sie schlägt, wenn Sie = anstelle von == schreiben. –

+5

@Ollie: Meinungen sind sehr unterschiedlich auf diesem. Was die Lesbarkeit betrifft, ist dies * eine schlechte Idee. Außerdem bietet es in Sprachen wie Java keinen Vorteil, da hier keine Verwirrung entstehen kann. Ich meine, niemand schreibt jemals einen Test als 'if (a == wahr)', oder? –

+0

@Konrad. Du hast Recht in Java, aber für diesen C-Runderneuerten, der in PERL und einigen anderen Sprachen arbeitet, hat es mich viele Male gerettet. –

Antwort

37

Da das "Ergebnis" einer Zuweisung der Wert zugewiesen ist ... so ist es immer noch ein boolean Ausdruck im zweiten Fall. if Ausdrücke erfordern die Bedingung, um eine boolean Ausdruck, der durch die zweite, aber nicht die erste erfüllt ist. Effektiv Ihre zwei Schnipsel sind:

int a; 

a = 1; 
if (a) { } 

und

boolean b; 

b = true; 
if (b) { } 

Ist es aus dieser Expansion deutlich, dass die zweite Version aber nicht die erste kompilieren?

Dies ist ein Grund, nicht direkt Vergleiche mit True und False zu machen. Also würde ich immer if (b) anstelle von if (b == true) und if (!b) anstelle von if (b == false) schreiben. Sie bekommen immer noch Probleme mit if (b == c), wenn b und c sind boolean Variablen, zugegebenermaßen - ein Tippfehler kann dort ein Problem verursachen. Ich kann nicht sagen, dass es mir jemals passiert ist.

EDIT: auf Ihre bearbeiten Reaktion - Zuweisungen aller Art können in if Anweisungen verwendet werden - und while Schleifen usw., solange der Gesamtzustand Ausdruck boolean ist. Zum Beispiel könnten Sie haben:

String line; 
while ((line = reader.readLine()) != null) 
{ 
    // Do something with a line 
} 

Während ich in der Regel vermeiden Nebenwirkungen bei Bedingungen, diese besondere Idiom für das Beispiel oft nützlich ist oben gezeigt, oder InputStream.read verwenden. Im Grunde ist es "während der Wert, den ich lese, nützlich ist, benutze es."

+3

Sind Sie sicher, dass im letzten Beispiel ein zusätzliches Klammerpaar vorhanden ist? Ich dachte, Zuordnung hat die letzte Priorität in Java ... –

+2

@Carlos: Guter Fang. Vielleicht bin ich so daran gewöhnt, es bewusst einzusetzen, ohne dass ich es versucht habe :) –

+0

Normalerweise denke ich an dieses Idiom (und benutze es, wenn die Analogie passt) in Bezug auf die hasNext und next Methoden des Iterators - es implementiert im Grunde ein Kombination von denen für etwas, das nicht explizit ein Iterator ist (und ich wünsche mir, dass Leser die Implementierung dieser Schnittstelle in späteren Versionen hinzugefügt haben). – Carl

10

Für if benötigen Sie einen Ausdruck, der boolean auswertet. b = true Evaluiert zu Boolean, aber a = 1 wertet Int als Zuordnungen ausgewertet immer die zugewiesenen Werte.

1

Der Grund, warum der zweite Code in Ordnung ist, ist, weil er 'b' den Wert von true zuweist und dann vergleicht, um zu sehen, ob b wahr oder falsch ist. Der Grund dafür ist, dass Sie Zuweisungsoperatoren innerhalb einer if-Anweisung ausführen können, UND Sie können sie selbst mit einem booleschen Objekt vergleichen. Es wäre das gleiche wie wenn (wahr).

1

In Java haben Sie kein implizites Casting. Also nicht boolesche Werte oder nicht automatisch in boolesche Werte umgewandelt.

Im ersten Fall ist das Ergebnis der Anweisungen ein int, das nicht boolesch ist und nicht funktioniert. Im letzten Fall ist das Ergebnis boolesch, was in einer if-Anweisung ausgewertet werden kann.

1

Die Regel ist nicht, dass "Zuordnung nicht in einer if Anweisung verwendet werden kann", sondern dass "die Bedingung in einer if Anweisung vom Typ boolean sein muss". Ein Zuweisungsausdruck erzeugt einen Wert des zugewiesenen Typs. Daher erlaubt Java nur die Zuweisung in einer if-Anweisung, wenn Sie einen boolean-Wert zuweisen.

Dies ist ein guter Grund, warum der Stil if (foo == true) vermieden werden sollte, und schreiben Sie einfach if (foo).