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)?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top