Kann jedes If-Else-Konstrukt durch einen äquivalenten Bedingungsausdruck ersetzt werden?

7

(Ich habe keine ernsthafte Notwendigkeit für diese Antwort, ich bin nur neugierig.)

Kann jedes If-Else-Konstrukt durch den bedingten Operator ?: ?

durch einen äquivalenten Bedingungsausdruck ersetzt werden     
whacko__Cracko 30.11.2009, 07:39
quelle

8 Antworten

10
  

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.

    
Roger Pate 30.11.2009, 08:02
quelle
4

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 ...

    
Drew Hall 30.11.2009 07:49
quelle
2

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.

    
DrPizza 30.11.2009 12:23
quelle
1
%Vor%

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.

    
Michael Krelin - hacker 30.11.2009 08:00
quelle
1

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.

    
sdcvvc 30.11.2009 09:27
quelle
1

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.

    
Michael Burr 30.11.2009 07:43
quelle
1

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 ...):

%Vor%

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. ;)

    
Amber 30.11.2009 07:42
quelle
0

GCC hat statement expression . Wenn Sie es verwenden, können Sie if -Anweisungen in äquivalente ?: -Ausdrücke umschreiben:

%Vor%

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.

%Vor%     
sambowry 30.11.2009 09:00
quelle

Tags und Links