Warum hat C keinen logischen Zuweisungsoperator?
Ich musste eine Anweisung des Formulars codieren
a = a || expr;
woexpr
sollte ausgewertet und das Ergebnis @ zugewiesen werda
iffa
ist nicht gesetzt. Dies hängt von den Kurzschlussfähigkeiten des logischen ODER ab.
Der kürzere Weg, um das Obige zu schreiben, wäre natürlich
a ||= expr;
aber (zu meiner Überraschung) C hat keine logischen Zuweisungsoperatoren.
So ist meine Frage zweifach. Erstens gibt es einen kürzeren Weg, um die erste Anweisung in Standard C zu schreiben (der ternäre Operator ist noch schlimmer -a = a ? a : expr
erfordert, dass ich buchstabierea
dreimal).
Zweitens, warum gibt es in C keine logischen Zuordnungen? Die möglichen Gründe, die mir einfallen könnten, sind:
es erschwert das Parsen der Grammatik? Gibt es eine gewisse Subtilität im Umgang mit Kurzschlüssen für diese Fälle?it wurde als überflüssig angesehen (aber ist das nicht ein Argument gegen ALLE Operatorzuweisungen?)BEARBEITE
Bitte entsperren Sie diese Frage, weil:
Die Frage, mit der es verknüpft wurde (als mutmaßliches Duplikat von), wurde nicht beantwortet. Die (akzeptierte) Antwort auf diese Frage besagt, dass||=
ist nicht vorhanden, da die Funktionalität von @ dupliziert wi|=
. Das ist die falsche Antwort.|=
schließt nicht kurz.
C und C ++ sind NICHT die gleichen Sprachen. Ich möchte wissen, warum C es nicht hat. Tatsächlich macht die Tatsache, dass abgeleitete Sprachen wie C ++ und insbesondere Java (die nicht unter den Problemen des Legacy-Codes litten, wie in Edmunds Antwort angedeutet), die Frage noch interessanter.
EDIT 2
Es scheint nun so, als ob meine ursprüngliche Absicht falsch war. In der Anweisunga = a || expr
(woa
ist ganzzahlig undexpr
gibt einen ganzzahligen Wert zurück, zuerst beidea
undexpr
wird implizit in "Boolesche Werte" konvertiert, und anschließend wird der "Boolesche" Wert @ zugewiesea
. Dies ist falsch - der Integralwert geht verloren. Danke, Jens und Edmund.
So für den ersten Teil der Frage, die richtigen Wege, nicht Alternativen :), meine Absicht zu codieren wäre:
if (!a) a = expr;
ode
a = a ? a : expr;
Sie sollten gleich optimiert werden (denke ich), obwohl ich persönlich die erste vorziehen würde (weil sie eine weniger hata
tippen)
Der zweite Teil der Frage bleibt jedoch bestehen. Die Argumente, die Jens und Edmund über die Mehrdeutigkeit in @ gegeben haba ||= expr
ebenso gut anwenden aufa = a || expr
. Der Zuweisungsfall kann einfach wie der normale behandelt werden:
a
to booleanwenn es wahr ist, wird der Wert des gesamten Ausdrucks gleich dem booleschen Wert vona
andernfalls bewertenexpr
, Ergebnis in Booleschen Wert konvertieren, @ zuweisa
und gib es zurückDie obigen Schritte scheinen sowohl für die Zuweisung als auch für den Normalfall gleich zu sein.