Questo errore è causato dalla sintassi del condizionale espressione che è
logical-OR-expression ? expression : conditional-expression
Pertanto, la parte successiva allo :
deve essere in grado di analizzare b = 200
. Tuttavia, conditional-expression
non può analizzare che, a causa un'espressione di assegnazione ha meno la precedenza - si avrebbe bisogno di mettere una parentesi intorno all'espressione assegnazione
a>=5 ? b=100 : (b=200);
Ma il fatto che avete bisogno di una parentesi fa non significa che l'espressione altrimenti viene analizzato come (a>=5 ? b=100 : b) = 200
, è solo un artefatto interno del compilatore che nel messaggio di errore parla dell'operando sinistro dell'assegnazione. Il linguaggio C ha le seguenti due regole per la sintassi delle espressioni di assegnazione, e la regola che corrisponde viene applicata
conditional_expression
unary_expression '=' assignment_expression
Questo interferisce con il parser discesa ricorsiva, che avrebbe semplicemente invocare parseConditionalExpression
, e verificare ciò che segue di token. Pertanto alcune implementazioni del parser C scelgono di non dare qui un errore di sintassi, ma lo analizzano come se la grammatica dicesse conditional_expression '=' ...
sopra, e in seguito quando ispeziona l'albero di analisi, convalidi che il lato sinistro sia un lvalue. Ad esempio, il codice sorgente Clang dice
/// 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.
E il codice sorgente del parser GCC dice
/* ...
In GNU C we accept any conditional expression on the LHS and
diagnose the invalid lvalue rather than producing a syntax
error. */
fonte
2016-08-17 17:04:18
utilizzare le parentesi per chiarire la precedenza dell'operatore che si desidera. (E non usare Turbo C. Ha più di 20 anni!) –
http://stackoverflow.com/questions/12068118/use-of-brackets-in-expression-that-include-ternary-operator –