Frage

Ich habe mit Java ein paar Jahren arbeiten, aber bis vor kurzem habe ich nicht über dieses Konstrukt laufen:

int count = isHere ? getHereCount(index) : getAwayCount(index);

Dies ist wahrscheinlich eine sehr einfache Frage, aber es kann mir jemand erklären? Wie lese ich es? Ich bin ziemlich sicher, dass ich weiß, wie es funktioniert.

  • wenn isHere wahr ist, getHereCount() heißt,
  • wenn isHere falsch getAwayCount() aufgerufen wird.

Richtig? Was ist dieses Konstrukt genannt?

War es hilfreich?

Lösung

Ja, es ist eine Kurzform von

int count;
if (isHere)
    count = getHereCount(index);
else
    count = getAwayCount(index);

Es ist die Konditionaloperator genannt. Viele Menschen (fälschlicherweise) nennen es die ternäre Operator , denn es ist der einzige ternäre (Drei-Argument) Operator in Java, C, C ++, und wahrscheinlich viele andere Sprachen. Aber theoretisch es könnte sein eine andere ternäre Operator, während es nur eine sein kann Bedingungsoperator .

Der offizielle Name in der Java Language Specification :

  

§15.25 Conditional Operator? :

     

Der Bedingungsoperator ? : verwendet der Booleschen Wert eines Ausdrucks, welcher von zwei anderen Ausdrücken zu entscheiden, sollte bewertet werden.

Beachten Sie, dass beiden Zweige zu Methoden mit Rückgabewerten führen müssen:

  

Es ist ein Fehler bei der Kompilierung für entweder den zweiten oder dritten Operanden Ausdruck ein Aufruf eines Hohlraums Methode.

     

In der Tat, von der Grammatik des Ausdrucks Aussagen ( §14.8 ), ist es nicht für einen bedingten Ausdruck erlaubt in jedem Kontext zu erscheinen, wo ein Aufruf einer void-Methode erscheinen könnte.

Also, wenn doSomething() und doSomethingElse() sind ungültig Methoden, können Sie dies nicht komprimieren:

if (someBool)
    doSomething();
else
    doSomethingElse();

in diesen:

someBool ? doSomething() : doSomethingElse();

Einfache Worte:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

Andere Tipps

Andere haben dies in angemessenem Umfang beantwortet, aber oft mit dem Namen „ternärer Operator“.

Als der Pedant, der ich bin, würde ich es gerne machen deutlich, dass der Name des Betreibers ist die bedingte Operator oder „Bedingungsoperator?“. Es ist a ternärer Operator (dadurch, dass es drei Operanden) und es geschieht im Moment der einzige ternäre Operator in Java sein.

Allerdings ist das spec ziemlich klar dass der Name der bedingte Operator oder „Bedingungsoperator?“ seine absolut eindeutig. Ich denke, es klarer ist es mit diesem Namen zu nennen, wie sie das Verhalten des Betreibers zu einem gewissen Grad anzeigt (Auswertung eine Bedingung) und nicht nur, wie viele Operanden hat.

Nach der Sun Java Specification ist es der Conditional Operator genannt. Siehe Abschnitt 15.25. Du hast recht, was es tut.

Der Bedingungsoperator? :. Der Boolesche Wert eines Ausdrucks verwendet, sollte die von zwei anderen Ausdrücken zu entscheiden, ausgewertet werden

Das bedingte Operator ist syntaktisch richtige assoziativen (es Gruppen von rechts nach links), so dass ein b: c d: e f: g bedeutet das gleiche wie ein B:? (C d :( ? e f: g.))

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

Der Bedingungsoperator hat drei Operanden Ausdrücke; ? erscheint zwischen dem ersten und zweiten Ausdrücke und. dem zweiten und dritten Ausdrücke erscheint zwischen

Der erste Ausdruck vom Typ boolean oder Boolean sein muss, oder einen Fehler bei der Kompilierung auftritt.

Nicht genau richtig, um genau zu sein:

  1. wenn isHere wahr ist, die Ergebnis von getHereCount () ist zurück
  2. otheriwse der Ergebnis von getAwayCount () ist zurück

Die „zurückgekehrt“ ist sehr wichtig. Es bedeutet, dass die Methoden muss einen Wert zurückgeben und diesen Wert muss irgendwo zugeordnet werden.

Außerdem ist es nicht genau syntaktisch äquivalent zu der if-else-Version. Zum Beispiel:

String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;

Wenn codiert mit if-else immer in mehr Bytecode zur Folge hat.

int count = isHere ? getHereCount(index) : getAwayCount(index);

bedeutet:

if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}
condition ? truth : false;

Wenn die Bedingung true wird dann wieder den ersten Parameter. Wenn die Bedingung false, geben Sie den zweiten Parameter ist.

Es wird der Conditional Operator und es ist eine Art von Ternary Betrieb .

Ternary, bedingt; Tomaten, tomatoh. Was es wirklich wertvoll ist für variabele Initialisierung. Wenn (wie ich) Sie initialisieren Variablen fond sind, wo sie definiert sind, die bedingte ternäre Operator (für sie beide ist) ermöglicht es Ihnen, zu tun, dass in Fällen, in denen Konditionalität über seinen Wert ist. Besonders bemerkenswert in abschließenden Feldern, aber nützlich anderswo auch.

z.

public class Foo {
    final double    value;

    public Foo(boolean positive, double value) {
        this.value = positive ? value : -value;
    }
}

Ohne diesen Operator - gleich welche Namens - würden Sie das Feld nicht endgültig leisten oder eine Funktion schreiben, einfach zu initialisieren Eigentlich, das ist nicht richtig -. Es noch initialisiert werden kann zu verwenden, wenn / else, zumindest in Java. Aber ich finde diese Reiniger.

Dieses Konstrukt wird als Ternary Operator in der Informatik und Programmierung Techniken. Karten und Link es die folgende Erklärung gibt, die ruhig ist gut zu verstehen:

  

Ein ternärer Operator ist eine Operation auf 3 Eingängen arbeitet. Es ist eine Abkürzung für eine if-else-Anweisung und wird auch als Bedingungsoperator bekannt.

     

In Perl / PHP funktioniert es wie:
boolean_condition ? true_value : false_value

     

In C / C ++ funktioniert es wie:
logical expression ? action for true : action for false

Dies könnte für einige logischen Bedingungen lesbar sein, die sonst nicht zu komplex sind, ist es besser, verwenden If-Else-Block mit beabsichtigter Kombination von bedingter Logik.

Wir können die vereinfachen If-Else-Blöcke mit diesem Ternary Operator für eine Codeanweisungszeile
. Zum Beispiel:

if ( car.isStarted() ) {
     car.goForward();
} else {
     car.startTheEngine();
}

Könnte die folgenden Indizes entsprechen:

( car.isStarted() ) ? car.goForward() : car.startTheEngine();

Wenn wir also auf Ihre Aussage beziehen:

int count = isHere ? getHereCount(index) : getAwayCount(index);

Es ist tatsächlich die 100% entspricht der folgenden If-Else-Block :

int count;
if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}

Das ist es!
Ich hoffe, das war hilfreich, jemanden!
Cheers!

Richtig. Es ist Namen ternäre Operator . Manche nennen es auch die Konditionaloperator .

Der Ternary Operator (?)

The ternary operator is an operator that takes three arguments. The first 
argument is a comparison argument, the second is the result upon a true 
comparison, and the third is the result upon a false comparison.

Sie könnten in einem Vorschlag für einige neue Operatoren, die zu dem bedingten Operator ähnlich sind. Die Null-safe Betreiber Code wie folgt aktivieren:

String s = mayBeNull?.toString() ?: "null";

Es wäre besonders praktisch, wenn Auto-Unboxing stattfindet.

Integer ival = ...;  // may be null
int i = ival ?: -1;  // no NPE from unboxing

Es wurde für weitere Überlegungen unter 7 JDK ausgewählt ist „Projekt Münze.“

Eigentlich kann es mehr als drei Argumente. Zum Beispiel wollen, wenn wir überprüfen, ob eine Zahl ist positiv, negativ oder Null können wir dies tun:

String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT's ZERO.";

, die besser ist als die Verwendung von if, else if, else.

Es ist der Bedingungsoperator, und es ist mehr als nur eine prägnante Art und Weise, wenn Aussagen zu schreiben.

Da es sich um einen Ausdruck, der einen Wert zurückgibt sie als Teil anderer Ausdrücke verwendet werden können.

Ja, Sie richtig sind. ?: Ist in der Regel des „dreifach konditionale Operator“ genannt, oft einfach als „ternären Operator“ bezeichnet. Es ist eine Kurzversion des Standard if / else bedingt.

Ternary Conditional Operator

ich zufällig mag diesen Operator, aber der Leser sollte in Betracht gezogen werden.

Sie müssen immer Code Kompaktheit mit der Zeit ausgleichen verbrachten lesen, und dass es ein paar ziemlich schwere Fehler hat.

Zunächst einmal gibt es den Original-Asker Fall. Er verbrachte nur eine Stunde darüber veröffentlichen und die Antworten zu lesen. Wie länger hätte es den Autor genommen jeder schreiben:? Wie ein if / then im Laufe seines ganzen Lebens. Keine Stunde sicher sein.

Zum anderes in C-ähnlichen Sprachen, erhalten Sie die Gewohnheit einfach zu wissen, dass conditionals das erste, was in der Linie ist. Das merkte ich, wenn ich Rubin war mit und kam über Zeilen wie:

callMethodWhatever(Long + Expression + with + syntax) if conditional

Wenn ich eine lange Zeit Ruby-Benutzer wäre, würde ich wahrscheinlich kein Problem mit dieser Linie gehabt haben, aber aus Richtung C, wenn Sie „callMethodWhatever“ als das erste, was in der Linie zu sehen, erwarten Sie sie ausgeführt werden. Die?. Ist weniger kryptisch, aber immer noch ungewöhnlich genug, wie aus einem Leser zu werfen

Der Vorteil ist aber ein wirklich geiles Gefühl im Bauch, wenn Sie eine 3-line if-Anweisung innerhalb von 1 der Linien schreiben können. Kann nicht leugnen :) Aber ehrlich gesagt, nicht unbedingt besser lesbar von 90% der Leute da draußen, einfach wegen seiner Seltenheit.

Wenn es wirklich eine Zuordnung basiert auf einer Boolesche Werte und ich habe kein Problem damit haben, aber es kann leicht missbraucht werden.

Bedingte Ausdrücke sind in einem ganz anderen Stil, ohne explizite, wenn in der Erklärung.

Die Syntax ist: Boolescher Ausdruck ? expression1: expression2;

Das Ergebnis dieser Bedingungsausdruck

expression1 wenn boolean-Ausdruck ist wahr;

sonst das Ergebnis wird expression2.

Angenommen, Sie die größere Anzahl von variablen num1 und num2 bis max zuweisen möchten. Sie können einfach eine Anweisung mit dem bedingten Ausdruck schreiben: max = (num1> num2)? num1: num2;

Hinweis: Die Symbole? und: erscheint zusammen in einem bedingten Ausdruck. Sie bilden einen bedingten Operator und auch ein ternärer Operator genannt, weil es drei Operanden verwendet. Es ist der einzige ternäre Operator in Java.

zitiert aus: Einführung in Java-Programmierung 10. Ausgabe von Y. Daniel Liang Seite 126-127

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