Dieser Fehler wird durch die Syntax des Bedingungsausdrucks bewirkt wird, welches
logical-OR-expression ? expression : conditional-expression
Deshalb der Teil nach :
muss b = 200
parsen können. Allerdings conditional-expression
kann das nicht analysieren, da ein Zuweisungsausdruck weniger Vorrang hat - man braucht eine Klammer um den Zuweisungsausdruck
a>=5 ? b=100 : (b=200);
Aber die Tatsache zu stellen, dass Sie eine Klammer brauchen hier nicht nicht bedeuten, dass der Ausdruck andernfalls wird als (a>=5 ? b=100 : b) = 200
geparst, es ist nur ein interner Artefakt des Compilers, der in der Fehlermeldung über den linken Operanden der Zuweisung spricht. Die Sprache C hat die folgenden zwei Regeln für die Zuweisung Ausdruck Syntax und die Regel, die angewendet wird
Spiele
conditional_expression
unary_expression '=' assignment_expression
Dies stört Rekursiver Abstieg, die einfach parseConditionalExpression
aufrufen würde, und überprüfen, was Token folgt. Daher wählen einige C-Parser-Implementierungen hier keinen Syntaxfehler aus, sondern parsen es, als ob die Grammatik oben und später, wenn der Syntaxanalysebaum untersucht wird, validiere, dass die linke Seite ein L-Wert ist. Zum Beispiel sagt die Clang Quellcode
/// Note: we diverge from the C99 grammar when parsing the assignment-expression
/// production. C99 specifies that the LHS of an assignment operator should be
/// parsed as a unary-expression, but consistency dictates that it be a
/// conditional-expession. In practice, the important thing here is that the
/// LHS of an assignment has to be an l-value, which productions between
/// unary-expression and conditional-expression don't produce. Because we want
/// consistency, we parse the LHS as a conditional-expression, then check for
/// l-value-ness in semantic analysis stages.
und den Quellcode des GCC-Parser sagt
/* ...
In GNU C we accept any conditional expression on the LHS and
diagnose the invalid lvalue rather than producing a syntax
error. */
Verwenden Sie Klammern die Operatorpräzedenz Sie wollen zu klären. (Und nicht Turbo C. Es ist über 20 Jahre alt!) –
http://stackoverflow.com/questions/12068118/use-of-brackets-in-expression-that-include-ternary-operator –