(Ich habe keine ernsthafte Notwendigkeit für diese Antwort, ich bin nur neugierig.)
Kann jedes If-Else-Konstrukt durch den bedingten Operator ?:
?
Können alle if-else-Konstrukte durch einen bedingten Operator durch einen äquivalenten Bedingungsausdruck ersetzt werden?
Nein, Sie haben das rückwärts gefragt. Die "bodys" von if / else enthalten Anweisungen, und es ist nicht möglich, jede Anweisung in einen Ausdruck umzuwandeln, wie beispielsweise try, while, break-Anweisungen und Deklarationen. Viele "Aussagen" sind jedoch wirklich verkleidete Ausdrücke:
%Vor%All dies sind Anweisungen, die aus einem Ausdruck (Inkrement, Zuweisung, Funktionsaufruf) bestehen und in Ausdrücke innerhalb eines Bedingten umgewandelt werden können.
Lassen Sie uns die Frage also umkehren, da es sich so anhört, als ob Sie wirklich wissen möchten, wie äquivalent if / else-Anweisungen zu ternären bedingten Ausdrücken sind: Kann jeder bedingte Ausdruck durch äquivalente if / else-Anweisungen ersetzt werden? Fast alles, ja. Ein gängiges Beispiel sind Return-Anweisungen:
%Vor%Aber auch andere Ausdrücke:
%Vor%Dies zeigt auf, wo bedingte Ausdrücke nicht einfach ersetzt werden können: Initialisierungen . Da Sie ein Objekt nur einmal initialisieren können, müssen Sie eine Initialisierung auflösen, die eine Bedingung verwendet, um stattdessen eine explizite temporäre Variable zu verwenden:
%Vor%Beachten Sie, dass dies viel mühsamer und umständlicher ist und etwas Typabhängiges erfordert, wenn SomeType nicht standardmäßig erstellt und zugewiesen werden kann.
Auf der Oberfläche davon, nein. Der Bedingungsoperator ist ein Ausdruck (dh er hat einen Wert), während if / else eine Anweisung ist (also keinen Wert hat). Sie erfüllen unterschiedliche "Bedürfnisse" innerhalb der Sprachsyntax.
Da Sie jedoch Ausdruckswerte ignorieren können und jeder Ausdruck durch Hinzufügen eines Semikolons in eine Anweisung umgewandelt werden kann, können Sie if / else mit einem bedingten Ausdruck und zwei Hilfsfunktionen emulieren:
%Vor% Aber nachdem ich das gesagt habe, bin ich mir nicht sicher, dass es mehr als eine Kuriosität ist ...Nein, natürlich nicht. Aus bereits genannten Gründen und mehr!
%Vor%Schau dir an, wo das erklärt wird. Es ist keine häufig verwendete Technik, aber es kann in Situationen wie COM verwendet werden, wo jeder Aufruf HRESULT zurückgibt, der (fast) immer Null bei Erfolg (S_OK) ist, nicht Null bei Fehler, also könnten Sie etwas schreiben wie:
%Vor%Der ternäre Operator kann nichts analoges tun.
kann nicht immer durch den Operator ?:
ersetzt werden. Sie können oft (wenn nicht immer) Ihren gesamten Code überdenken, um diesen Ersatz bereitzustellen, aber generell können Sie nichts, was die Ausführung steuert, in ?:
setzen. break
, return
, Schleifen, throw
, etc.
Im Prinzip ja:
%Vor%wird
%Vor% Im Vergleich zur Verwendung von Prozeduren (die natürlicher sind), erlaubt dies break
, continue
, return
usw. Es erfordert die Auswertung von A
endet nicht mit TrueResult
/ FalseResult
aber wenn Sie verwenden diese Ausnahmen nur, um if
zu simulieren, dies ist kein Problem.
Die Verwendung des Bedingungsoperators führt zu einem Ausdruck, und beide möglichen Ergebnisse des Bedingungsoperators müssen "kompatibel" (konvertierbar in denselben Typ) sein.
Ein if
- else
-Konstrukt braucht nicht einmal irgendeinen Typ 'zurückzugeben', viel weniger den gleichen aus beiden Zweigen.
Der Bedingungsoperator erwartet, dass beide Elemente den ?
als rvalues entsprechen (da das Ergebnis eines Bedingungsoperators selbst ein rvalue ist). Obwohl ich nicht ganz ein Experte für C / C ++ - Standards bin, Meine Intuition wäre, dass das folgende nicht erlaubt wäre (oder wenn das nicht funktioniert, extrem schlechter Programmierstil ...):
während die if-else-Version ziemlich Standard wäre:
%Vor%Nun, das sagte, könntest du irgendein Programm nehmen und ein ähnlich funktionierendes Programm schreiben, das nicht if-else benutzt? Sicher, Sie könnten es wahrscheinlich. Das heißt aber nicht, dass es eine gute Idee wäre. ;)
GCC hat statement expression
. Wenn Sie es verwenden, können Sie if
-Anweisungen in äquivalente ?:
-Ausdrücke umschreiben:
BEARBEITEN: Die void
Umwandlungen dienen zwei Zwecken. Die Teilausdrücke in ?:
müssen denselben Typ haben, und ohne den void
-Ausdruck kann der Compiler warning: statement with no effect
ausgeben.
Tags und Links c c++ conditional-operator