Kann jede if...then...else-Anweisung in eine äquivalente Anweisung umgewandelt werden, die nur ? verwendet:
Antworten
Zu viele Anzeigen?Während jede denkbare Verwendung des ternären Operators als if/else implementiert werden kann, ist das Gegenteil nicht der Fall; zumindest nicht, ohne auf perverse und sinnlose "Tricks" zurückzugreifen, die keine Vorteile in Bezug auf Leistung, Lesbarkeit oder Wartbarkeit bringen.
Die Syntax von if/else lautet:
if( <boolean expression> )
<statment>|<statment block>
else
<statment>|<statment block>
während die Syntax des ternären Operators ?: lautet:
<boolean expression> ? <expression> : <expression> ;
Wichtig ist dabei, dass ein <expression>
und eine <statement>
sind unterschiedliche syntaktische Elemente.
Die sehr begrenzte Verwendung des Formulars:
if( b ) x = y else x = z ;
kann als implementiert werden:
x = b ? y : x ;
aber hier besteht die Einschränkung darin, dass dieselbe Variable sowohl in den wahr- als auch in den falsch-Klauseln zugewiesen wird (und daher y und z beide mindestens in den Typ von x konvertierbar sind). Es kann also gesagt werden, dass jede bedingte Zuweisung kann mit dem ternären Operator implementiert werden (schließlich ist das sein Hauptzweck).
Da ein Funktionsaufruf ein gültiger Ausdruck ist, könnten Sie die wahr- und falsch-Klauseln in separate Funktionen verpacken, aber das zu tun, nur um ein Argument zu beweisen, ist etwas pervers:
if( b )
true_stuff() ;
else
false_stuff() ;
ist gleichbedeutend mit:
b ? true_stuff() : false_stuff() ;
und diese Funktionen können jeden beliebigen Code enthalten.
Um den allgemeineren if/else-Fall in eine ?:-Operation umzuwandeln, müssen die true/false-Anweisungsblöcke zunächst in separate Funktionen verpackt werden. Aber selbst dann werden die Beispiele von Neil Butterworth diesen Ansatz zunichte machen, da das Verhalten von break
, continue
y return
den Kontrollfluss über die Grenzen des if/else-Konstrukts hinaus beeinflussen (obwohl dies vielleicht auch Beispiele für Code sind, den Sie vermeiden wollen!). Das Vorhandensein einer goto
in der if/else-Anweisung würde diesen Ansatz ebenfalls zunichte machen. .
Ich denke, selbst wenn man es könnte, warum sollte man es wollen?
Nein.
Beide "Zweige" des bedingten Ausdrucks müssen zu demselben Typ ausgewertet werden, und dieser Typ darf nicht void
.
Sie könnten zum Beispiel so vorgehen:
x > 0 ? printf("Positive!\n") : 0;
denn printf
return int
. (Ich würde dies allerdings nur bei einer Runde Code-Golf verwenden, Ich habe gerade .)
Aber das können Sie nicht tun:
x > 0 ? exit() : 0;
denn exit
gibt zurück. void
(oder eigentlich gar nicht zurückkehrt).