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) = 1
e i
entre parênteses. Portanto, (i)
deve ser um rvalor.
Então, minha pergunta é: é
(i) = 1
ilegal neste padrão C?
c
language-lawyer
variable-assignment
rvalue
lvalue-to-rvalue
ravenisadesk
fonte
fonte
i
entre 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-> IDENTIFIERassignment-expression
gramática não-terminal não é a mesma coisa que uma expressão de atribuição. Grosso modo, anassignment-expression
é uma expressão de atribuição ou qualquer coisa com maior precedência.Respostas:
Para citar n1570 (o último rascunho do padrão C11 antes da publicação):
i
é um valor l, de acordo com o exposto acima(i)
. E para responder sua pergunta, a expressão(i) = 1
é C. válidafonte
( expression )
portanto, o tipo e o valor são idênticos aexpression
, eexpression
é umassignment expression
, eassignment expression
é umprimary expression
, simplesmente,i
será tratado comoassignment expression
finalmente, portanto, deve seguir a regra deassignment expression
at por último, então deve ser um valor, eu acho.i = 1
está dizendo que também é inválido?i = 1
é válido por causa disso:assignment-expression: unary-expression assignment-operator assignment-expression
no casoi = 1
, eu sou tratado comounary-expression
, que é um valor l, nãoassignment expression
, acho que seui = 1
exemplo não é o caso.(i)
injustamente aqui. O mesmo ponto sobre semântica se aplica a todo tipo de expressão.O StoryTeller já explicou em que parte do padrão, por que, no seu exemplo, a expressão
(i)
ainda é um valor mínimo, mas acredito que você está sendo suspenso pelas especificações sem nenhum motivo, por isso, permita-me tentar abordar suas preocupações.A citação inteira refere-se à expressão de atribuição como um todo, não a lhs ou rhs.
"Um operador de atribuição deve ter um valor modificável como seu operando esquerdo." afirma que o lhs deve ser um valor modificável.
"Uma expressão de atribuição tem o valor do operando esquerdo após a atribuição, mas não é um valor l." declara que toda a expressão de atribuição em si tem o valor de lhs e é um rvalue.
Portanto, o seguinte é verdadeiro:
Por que isso é significativo? Considere o seguinte:
Não, isso está incorreto.
(i) = 1
é a única expressão de atribuição. Existem duas subexpressões (um identificador entre parênteses(i)
e uma constante numérica1
).fonte
Esta resposta é inspirada em @Eric Postpischil.
a produção de a
assignment-expression
é:no padrão, o
assignment expression
específico significa expressões com operadores de atribuição. Assim:então a regra:
serve apenas para produção
<unary-expression> <assignment-operator> <assignment-expression>
, não para<conditional-expression>
no exemplo
(i) =1
,i
é um,<assignment-expression>
mas não umassignment expression
, é um,<conditional-expression>
portanto, é um lvaule, portanto,(i)
é um lvalue.fonte