Associatividade de operadores
# Associatividade de operadores

Em Linguagens de programação e Notação matemática, a associatividade de um operador é uma propriedade que determina como operadores de mesma precedência são agrupados na ausência de parêntesis. Operadores podem ser associativos-à-esquerda, associativos-à-direita ou não-associativos. A associatividade e a precedência de um operador depende da linguagem de programação em questão.
Considere a expressão a ~ b ~ c. Se o operador ~ tem associatividade à esquerda, essa expressão seria interpretada como (a ~ b) ~ c e avaliada da esquerda para a direita. Se o operador tem associatividade à direita, a expressão seria interpretada como a ~ (b ~ c) e avaliada da direita para a esquerda. Se o operador não é associativo, a expressão pode resultar em um erro de sintaxe, como no caso do operador de exponenciação ** da linguagem de programação Ada, ou pode ter algum significado especial.
Muitos manuais de linguagem de programação fornecem uma tabela de precedência dos operadores e associatividade, ver, por exemplo, tabela de C e C ++.

## Exemplos

Associatividade é necessária somente quando os operadores em uma expressão tem a mesma precedência. Usualmente + e - tem a mesma precedencia - são chamados de operadores aditivos. Considere a expressão 7 − 4 + 2. O resultado poderia ser tanto (7 − 4) + 2 = 5 ou 7 − (4 + 2) = 1. O resultado anterior corresponde ao caso quando + e − são associativos à esquerda, este último quando + e - são associativos à direita.
Normalmente, os operadores de adição, subtração, multiplicação e divisão são associativos à esquerda, enquanto exponenciação, atribuição e os operadores condicionais ?: (das linguagens C, C++ e Java) são associativos à direita. Para evitar casos em que os operandos estariam associada com dois operadores, ou nenhum operador, os operadores com a mesma precedência devem ter a mesma associatividade.

### Um exemplo detalhado

Considere a expressão 5^4^3^2. Um analisador sintático sempre lê os tokens da esquerda para a direita. Mas por causa da associatividade à direita do operador ^, acontecerá o seguinte em um analisador sintático simples:
* 5 é lido.
* O primeiro operador ^ é lido. 5 é associado a ele.
* 4 é lido. Ele é associado ao único operador ^ lido até o momento.
* O segundo operador ^ é lido. 4 é re-associado a ele devido a associatividade à direita. Então esta construção é toda associada ao primeiro operador ^ como se fosse o operando da direita.
* 3 é lido. Este é associado ao segundo operador ^.
* O terceiro operador ^ é lido. 3 é re-associado a ele devido a associatividade à direita. Então esta construção é toda associada ao segundo operador ^ como se fosse o operando da direita.
* 2 é lido. Este é associado ao terceiro operador ^. Resultando na árvore sintática 5^(4^(3^2)), que pode ser avaliada em uma busca por profundidade, iniciando do nodo raiz (o primeiro ^):
* O avaliador desce na árvore, do primeiro, sobre o segundo, até o terceiro ^.
* Ele avalia: 3² = 9. Então ele põe o resultado no lugar da expressão, como segundo operando da de cima (segundo operador) ^.
* Ele sobe um nível e avalia a expressão resultante: 4$^9$ = 262144. Então ele coloca o resultado no lugar da expressão, como segundo operando da de cima (primeiro operador) ^.
* De novo, ele sobe um nível, e avalia a expressão resultante: 5$^{262144}$ ≈ 6.2060699 × 10$^{183230}$. Este se torna o resultado remanescente, e então, a avaliação finaliza com sucesso.
A avaliação associativa à esquerda teria resultado na árvore de análise sintática ((5^4)^3)^2 e os resultados completamente diferentes 625, 244140625 e finalmente ~ 5,9604645 × 10 $^{16}$.

## Associatividade à direita dos operadores de atribuição

Os operadores de atribuição em linguagens de programação imperativas são geralmente definidos como associativos à direita. Por exemplo, em C, a atribuição a = b é uma expressão que retorna um valor (ou seja, b convertido para o tipo de a), com o efeito colateral de alimentar a com esse valor. Uma atribuição pode ser realizada no meio de uma expressão.(Uma expressão pode ser feita em uma instrução seguindo-a com um ponto e vírgula; ou seja, a = b é uma expressão mas a = b; é uma instrução). A associatividade à direita do operador = permite que expressões como a = b = c possam ser interpretadas como a = (b = c), alimentando desse modo ambas variáveis a e b com o valor armazenado em c. A forma alternativa (a = b) = c não faz sentido porque a = b não pode receber um valor.

## Operadores Não-Associativos

Operadores não-associativos são operadores que não têm comportamento definido quando usados em conjunto em uma expressão. Em Prolog, o operador infixo :- é não-associativo porque construções tais como "a :- b :- c" constituem erros de sintaxe. Em Python, operadores de comparação (tais como >, ==, e <=) são não-associativos porque expressões tais como a < b < c têm um significado distinto de (a < b) < c or a < (b < c). Neste caso, a expressão é sinónimo de (a < b) e (b < c). Em Ada, o operador de exponenciação ** é não-associativo porque construções tais como "a ** b ** c" constituem erros de sintaxe.