Quando a associatividade do operador é importante?
-
21-12-2019 - |
Pergunta
A maioria das linguagens de programação possui uma tabela de precedência e associatividade para operadores binários.A associatividade é importante em alguns casos, por ex. (a - b) - c
!= a - (b - c)
.
No entanto, para um operador associativo como &&
parece não importar, mas a maioria das línguas lista isso como associativo à esquerda.
Existem situações em que há realmente uma diferença entre (a && b) && c
e a && (b && c)
?
Solução
Não acredito que haja tantas respostas erradas (excluídas)...talvez eu devesse responder isso.
Em primeiro lugar, precedência != associatividade != ordem de avaliação.
Agora que já resolvemos isso:a associatividade é importante em alguns casos.
Para a + b + c
, importa quando a
, b
, e c
são números de ponto flutuante em vez de inteiros, porque os erros de arredondamento se acumularão de maneira diferente dependendo de como os termos são agrupados.
Para o caso particular de &&
e ||
, não importa desde que não estejam sobrecarregados (o que é possível apenas em C++, não em C), mas a linguagem ainda define uma apenas por consistência - e para que a representação em "árvore" do código (baseada na gramática) seja única.Isso também beneficia o C++, já que agora o significado de sobrecarregado &&
e ||
não é ambíguo.
Outras dicas
Adicionando à resposta @Mehrdads@ (que votei positivamente):
Se você já construiu um analisador, notará que seus operadores precisam ter associatividade, caso contrário
a && b && c
seria simplesmente um erro de sintaxe.Supondo que o que foi dito acima não seja um erro de sintaxe, você deve decidir se isso significa:
(a && b) && c
ou
a && (b && c)
Você não pode simplesmente dizer:Eu não ligo.