Typinferenz in bedingten Ausdrücken
Der bedingte Operator (?:) ist ein leistungsstarkes Werkzeug in C, das prägnanten und ausdrucksstarken Code ermöglicht. Das Verständnis des Ergebnistyps dieses Operators kann jedoch für die ordnungsgemäße Verwendung von entscheidender Bedeutung sein.
Betrachten Sie das folgende Codebeispiel:
int x = 1; int y = 2; (x > y ? x : y) = 100;
In diesem Fall ergibt der erste bedingte Operator einen R-Wert von Typ int, da beide Operanden vom Typ int sind. Daher ist die Zuweisung gültig.
Im folgenden Beispiel gilt jedoch:
int x = 1; long y = 2; (x > y ? x : y) = 100;
Der Bedingungsoperator kann nicht als L-Wert ausgewertet werden, da der zweite und dritte Operand unterschiedliche Typen haben. Folglich ist eine Zuweisung zu diesem Ausdruck ungültig:
error: lvalue required as left operand of assignment | (x > y ? x : y) = 100; | ~~~~~~~^~~~~~~~
Um dieses Verhalten zu verstehen, müssen wir uns mit dem Konzept der Wertkategorien in C befassen.
Ein bedingter Ausdruck erbt seinen Typ und Wertkategorie aus ihren Operanden. Wenn beide Operanden L-Werte sind, ist der bedingte Ausdruck ebenfalls ein L-Wert. Wenn einer der Operanden ein R-Wert ist, ist der bedingte Ausdruck ein R-Wert.
Im ersten Beispiel sind sowohl x als auch y L-Werte desselben Typs, sodass der bedingte Ausdruck zu einem L-Wert vom Typ int ausgewertet wird. Im zweiten Beispiel ist x ein L-Wert, aber y ein R-Wert, sodass der bedingte Ausdruck nicht als L-Wert ausgewertet werden kann.
Es ist wichtig zu bedenken, dass die Wertkategorie des Bedingungsoperators zur Kompilierungszeit bestimmt wird. Auch wenn die Bedingung „falsch“ ergibt, müssen Typ und Wertkategorie des Bedingungsausdrucks konsistent bleiben. Dies steht im Einklang mit der Regel, dass die linke Seite eines Zuweisungsoperators ein L-Wert sein muss.
Das obige ist der detaillierte Inhalt vonWie wirkt sich die C-Typ-Inferenz auf das L-Wert/R-Wert-Verhalten bedingter Ausdrücke aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!