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:

Konvertierena to booleanwenn es wahr ist, wird der Wert des gesamten Ausdrucks gleich dem booleschen Wert vonaandernfalls bewertenexpr, Ergebnis in Booleschen Wert konvertieren, @ zuweisa und gib es zurück

Die obigen Schritte scheinen sowohl für die Zuweisung als auch für den Normalfall gleich zu sein.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage