Ich habe ein paar Jahre mit Java gearbeitet, aber bis vor kurzem bin ich nicht auf dieses Konstrukt gestoßen:
int count = isHere ? getHereCount(index) : getAwayCount(index);
Dies ist wahrscheinlich eine sehr einfache Frage, aber kann jemand sie erklären? Wie lese ich es? Ich bin mir ziemlich sicher, dass ich weiß, wie es funktioniert.
- wenn
isHere
es wahrgetHereCount()
ist, heißt es - wenn
isHere
falschgetAwayCount()
ist, wird aufgerufen.
Richtig? Wie heißt dieses Konstrukt?
java
syntax
ternary-operator
conditional-operator
Hauptstränge
quelle
quelle
Antworten:
Ja, es ist eine Kurzform von
Es heißt der bedingte Operator . Viele Leute nennen es (fälschlicherweise) den ternären Operator , weil es der einzige ternäre Operator (mit drei Argumenten) in Java, C, C ++ und wahrscheinlich vielen anderen Sprachen ist. Theoretisch könnte es jedoch einen anderen ternären Operator geben, während es nur einen bedingten Operator geben kann .
Der offizielle Name ist in der Java-Sprachspezifikation angegeben :
Beachten Sie, dass beide Zweige zu Methoden mit Rückgabewerten führen müssen:
Wenn also
doSomething()
unddoSomethingElse()
void Methoden sind, können Sie dies nicht komprimieren:das mögen:
Einfache Worte:
quelle
the
in die Kursivschrift von einbezogenthe ternary operator
, und das, was er meint, ist falsch, nicht dasternary operator
ist falsch. Der ternäre Operator impliziert, dass es, wie Michael sagt, der einzige ist, der wiederum zu der Annahme führen könnte, dass es keine anderen ternären Operatoren geben kann, was Michael als falsch bezeichnet, und ich würde zustimmen, dass dies der Fall ist eine falsche Annahme.Andere haben dies in angemessenem Umfang beantwortet, jedoch häufig mit dem Namen "ternärer Operator".
Als der Pedant, der ich bin, möchte ich klarstellen, dass der Name des Operators der bedingte Operator oder "bedingter Operator ?:" Ist. Es ist ein ternärer Operator (da er drei Operanden hat) und derzeit der einzige ternäre Operator in Java.
Die Spezifikation ist jedoch ziemlich klar, dass ihr Name der bedingte Operator oder "bedingte Operator ?:" Ist, um absolut eindeutig zu sein. Ich denke, es ist klarer, es bei diesem Namen zu nennen, da es das Verhalten des Operators in gewissem Maße anzeigt (Bewertung einer Bedingung) und nicht nur die Anzahl der Operanden.
quelle
&&
den Bedingungs- und Operator und||
den Bedingungs- oder Operator aufruft , sondern nur "den bedingten Operator" für?:
.Gemäß der Sun Java-Spezifikation wird sie als bedingter Operator bezeichnet. Siehe Abschnitt 15.25. Sie haben Recht, was es tut.
Der bedingte Operator? : verwendet den booleschen Wert eines Ausdrucks, um zu entscheiden, welcher von zwei anderen Ausdrücken ausgewertet werden soll.
Der bedingte Operator ist syntaktisch rechtsassoziativ (er gruppiert von rechts nach links), so dass a? B: c? D: e? F: g dasselbe bedeutet wie a? B: (c? D: (e? F.) :G)).
Der bedingte Operator hat drei Operandenausdrücke. ? erscheint zwischen dem ersten und dem zweiten Ausdruck und: erscheint zwischen dem zweiten und dritten Ausdruck.
Der erste Ausdruck muss vom Typ Boolean oder Boolean sein, da sonst ein Fehler bei der Kompilierung auftritt.
quelle
meint :
quelle
Nicht genau richtig, um genau zu sein:
Diese "Rückkehr" ist sehr wichtig. Es bedeutet , dass die Methoden müssen einen Wert zurückgeben und dieser Wert muss irgendwo zugeordnet werden.
Außerdem entspricht es nicht genau der if-else-Version. Beispielsweise:
Wenn mit if-else codiert, wird immer mehr Bytecode erstellt.
quelle
Ternär, bedingt; Tomate, Tomate. Wofür es wirklich wertvoll ist, ist die variable Initialisierung. Wenn Sie (wie ich) gerne Variablen dort initialisieren, wo sie definiert sind, können Sie dies mit dem bedingten ternären Operator (denn es ist beides) in Fällen tun, in denen eine Konditionalität über ihren Wert besteht. Besonders bemerkenswert in den letzten Bereichen, aber auch anderswo nützlich.
z.B:
Ohne diesen Operator - mit welchem Namen auch immer - müssten Sie das Feld nicht endgültig machen oder eine Funktion schreiben, um es einfach zu initialisieren. Eigentlich ist das nicht richtig - es kann immer noch mit if / else initialisiert werden, zumindest in Java. Aber ich finde das sauberer.
quelle
Wenn die Bedingung erfüllt ist,
true
bewerten Sie den ersten Ausdruck. Wenn die Bedingung erfüllt istfalse
, bewerten Sie den zweiten Ausdruck.Es wird als bedingter Operator bezeichnet und ist eine Art ternärer Operation .
quelle
Dieses Konstrukt wird in Informatik und Programmiertechniken als ternärer Operator bezeichnet .
Und Wikipedia schlägt folgende Erklärung vor:
Diese Syntax ist nicht nur in Java, sondern auch in PHP und Objective-C verfügbar.
Im folgenden Link gibt es die folgende Erklärung, die ziemlich gut zu verstehen ist:
Dies kann für einige logische Bedingungen lesbar sein, die nicht zu komplex sind. Andernfalls ist es besser, den If-Else-Block mit der beabsichtigten Kombination von bedingter Logik zu verwenden.
Mit diesem ternären Operator können wir die If-Else-Blöcke für eine Code-Anweisungszeile vereinfachen .
Beispielsweise:
Könnte gleich sein wie folgt:
Wenn wir uns also auf Ihre Aussage beziehen:
Es ist tatsächlich das 100% -Äquivalent des folgenden If-Else-Blocks :
Das ist es!
Hoffe das war hilfreich für jemanden!
Prost!
quelle
Richtig. Es nennt die ternäre Operator . Einige nennen es auch den bedingten Operator .
quelle
Sein ternärer Operator (? :)
quelle
Möglicherweise interessieren Sie sich für einen Vorschlag für einige neue Operatoren, die dem bedingten Operator ähnlich sind. Die null-sicheren Operatoren aktivieren Code wie folgt:
Es wäre besonders praktisch, wenn das automatische Entpacken stattfindet.
Es wurde zur weiteren Prüfung unter JDK 7s "Project Coin" ausgewählt.
quelle
Tatsächlich kann es mehr als 3 Argumente dauern. Wenn wir beispielsweise prüfen möchten, ob eine Zahl positiv, negativ oder null ist, können wir dies tun:
Das ist besser als wenn, sonst wenn, sonst.
quelle
Es ist der bedingte Operator und mehr als nur eine präzise Schreibweise für if-Anweisungen.
Da es sich um einen Ausdruck handelt, der einen Wert zurückgibt, kann er als Teil anderer Ausdrücke verwendet werden.
quelle
Ja du hast Recht. ?: wird typischerweise als "ternärer bedingter Operator" bezeichnet, der oft einfach als "ternärer Operator" bezeichnet wird. Es ist eine Kurzversion des Standards, wenn / sonst bedingt.
Ternärer bedingter Operator
quelle
Ich mag diesen Operator wirklich, aber der Leser sollte berücksichtigt werden.
Sie müssen die Codekompaktheit immer mit der Zeit abwägen, die Sie für das Lesen aufgewendet haben, und darin gibt es einige ziemlich schwerwiegende Fehler.
Zuallererst gibt es den Fall des Original Asker. Er verbrachte nur eine Stunde damit, darüber zu posten und die Antworten zu lesen. Wie lange hätte der Autor gebraucht, um jeden zu schreiben ?: Als Wenn / Dann im Laufe seines ganzen Lebens. Keine Stunde, um sicher zu sein.
Zweitens haben Sie in C-ähnlichen Sprachen die Angewohnheit, einfach zu wissen, dass Bedingungen das erste sind, was in der Zeile steht. Ich bemerkte dies, als ich Ruby verwendete und stieß auf Zeilen wie:
Wenn ich lange Zeit Ruby-Benutzer gewesen wäre, hätte ich wahrscheinlich kein Problem mit dieser Zeile gehabt, aber wenn Sie von C kommen und "callMethodWhatever" als erstes in der Zeile sehen, erwarten Sie, dass sie ausgeführt wird. Das ?: Ist weniger kryptisch, aber immer noch ungewöhnlich genug, um einen Leser auszuschalten.
Der Vorteil ist jedoch ein wirklich cooles Gefühl in Ihrem Bauch, wenn Sie eine 3-zeilige if-Anweisung in den Raum von 1 der Zeilen schreiben können. Kann das nicht leugnen :) Aber ehrlich gesagt, nicht unbedingt besser lesbar für 90% der Leute da draußen, einfach wegen seiner Seltenheit.
Wenn es sich wirklich um eine Aufgabe handelt, die auf einem Booleschen Wert und Werten basiert, habe ich kein Problem damit, aber es kann leicht missbraucht werden.
quelle
Bedingte Ausdrücke haben einen völlig anderen Stil, ohne explizites Wenn in der Anweisung.
Die Syntax lautet: Boolescher Ausdruck? Ausdruck1: Ausdruck2;
Das Ergebnis dieses bedingten Ausdrucks ist
expression1 wenn boolean-expression wahr ist;
Andernfalls lautet das Ergebnis expression2.
Angenommen, Sie möchten die größere Anzahl der Variablen num1 und num2 max. Sie können einfach eine Anweisung mit dem bedingten Ausdruck schreiben: max = (num1> num2)? num1: num2;
Hinweis: Die Symbole? und: erscheinen zusammen in einem bedingten Ausdruck. Sie bilden einen bedingten Operator und werden auch als ternärer Operator bezeichnet, da drei Operanden verwendet werden. Es ist der einzige ternäre Operator in Java.
zitiert aus: Einführung in die Java-Programmierung 10. Ausgabe von Y. Daniel Liang Seite 126 - 127
quelle