Ich schreibe einen C-Compiler, der diesem Standard folgt , und wenn ich Anweisungen wie diese analysiere:
int i;
(i) = 1;
Mein Compiler meldet einen Fehler, der darauf hinweist, dass (i)es sich um einen Wert handelt, der nicht zuweisbar sein sollte.
Ich habe den Code und die Regeln überprüft und Folgendes festgestellt: In der Semantik des Zuweisungsausdrucks:
Ein Zuweisungsoperator muss einen modifizierbaren Wert als linken Operanden haben.
Ein Zuweisungsausdruck hat den Wert des linken Operanden nach der Zuweisung, ist jedoch kein l-Wert.
In meinem Fall gibt es zwei Zuweisungsausdrücke:
(i) = 1und iin Klammern. Das (i)sollte also ein Wert sein.
Meine Frage lautet also: Ist
(i) = 1dieser C-Standard illegal?
iin Klammern steht kein Zuweisungsausdruck. Zuweisungsausdruck bedeutet nicht "Ausdruck, der an einer Zuweisung beteiligt ist" oder irgendetwas anderes, wo (i)dies qualifiziert wäre. Zuweisungsausdrücke sind Zuweisungen .
iist ein Zuweisungsausdruck wird der AST Baum EXPRESSION-> ASSIGNMENT_EXPRESSION-> CONDITIONAL_EXPRESSION-> LOGICAL_OR_EXPRESSION-> CAST_EXPRESSION-> UNARY_EXPRESSION-> POSTFIX_EXPRESSION-> PRIMARY_EXPRESSION-> IDENTIFIER
assignment-expressionGrammatik-Nichtterminal ist nicht dasselbe wie ein Zuweisungsausdruck. In etwa assignment-expressionist ein Zuweisungsausdruck oder etwas mit höherer Priorität.