Estou escrevendo um compilador C que segue esse padrão e se eu analisar declarações como esta:
int i;
(i) = 1;
meu compilador relatará um erro que indica que (i)é um rvalue e não deve ser atribuído.
Eu verifiquei o código e as regras e descobri o seguinte: na atribuição semântica da expressão:
Um operador de atribuição deve ter um valor modificável como seu operando esquerdo.
Uma expressão de atribuição possui o valor do operando esquerdo após a atribuição, mas não é um valor l.
No meu caso, existem duas expressões de atribuição:
(i) = 1e ientre parênteses. Portanto, (i)deve ser um rvalor.
Então, minha pergunta é: é
(i) = 1ilegal neste padrão C?
ientre parênteses não é uma expressão de atribuição. Expressão de atribuição não significa "expressão envolvida em uma atribuição" ou qualquer outra coisa em (i)que se qualifique. Expressões de atribuição são atribuições .
ié uma expressão de atribuição, a árvore AST é EXPRESSION-> ASSIGNMENT_EXPRESSION-> CONDITIONAL_EXPRESSION-> LOGICAL_OR_EXPRESSION-> CAST_EXPRESSION-> UNARY_EXPRESSION-> POSTFIX_EXPRESSION-> PRIMARY_EXPRESSION-> IDENTIFIER
assignment-expressiongramática não-terminal não é a mesma coisa que uma expressão de atribuição. Grosso modo, an assignment-expressioné uma expressão de atribuição ou qualquer coisa com maior precedência.