O que é associatividade (para um operador) e por que é importante?
Atualizado: associatividade do operador
O que é associatividade (para um operador) e por que é importante?
Atualizado: associatividade do operador
Respostas:
Para operadores, associatividade significa que, quando o mesmo operador aparece em uma linha, então qual ocorrência de operador aplicamos primeiro. A seguir, deixe Q
ser o operador
a Q b Q c
Se Q
for associativo à esquerda, ele será avaliado como
(a Q b) Q c
E se for associativa correta, então avalia como
a Q (b Q c)
É importante, pois muda o significado de uma expressão. Considere o operador de divisão com aritmética inteira, que é associativa à esquerda
4 / 2 / 3 <=> (4 / 2) / 3 <=> 2 / 3 = 0
Se fosse associativo correto, seria avaliado como uma expressão indefinida, já que você dividiria por zero
4 / 2 / 3 <=> 4 / (2 / 3) <=> 4 / 0 = undefined
expr -> expr + term;
é associativo à esquerda e expr -> term + expr
associativo à direita.
a * b / c
se *
seria associativo à esquerda, mas /
seria associativo à direita? Então há uma contradição. Portanto, acho que é necessário dizer "quando os operadores com a mesma precedência e associatividade" se quiser abranger vários operadores.
Existem três tipos de associatividade:
A propriedade associativa em matemática
Ordem de operações em linguagens de programação
Associatividade em caches de CPU.
A propriedade associativa em matemática é uma propriedade de operadores como adição (+). Esta propriedade permite reorganizar os parênteses sem alterar o valor de uma instrução, ou seja:
(a + b) + c = a + (b + c)
Em linguagens de programação, a associatividade (ou fixidez) de um operador é uma propriedade que determina como os operadores de mesma precedência são agrupados na ausência de parênteses; ou seja, em que ordem cada operador é avaliado. Isso pode ser diferente entre as linguagens de programação.
Em caches de CPU, a associatividade é um método de otimização de desempenho.
Simples!!
Left Associative means we evaluate our expression from left to right
Right Associative means we evaluate our expression from right to left
Sabemos que *, / e% têm a mesma precedência, mas de acordo com a associatividade, a resposta pode mudar:
Por exemplo: Temos a expressão: 4 * 8/2% 5
Left associative: (4 * 8) / 2 % 5 ==> (32 / 2) % 5 ==> 16 % 5 ==> 1
Right associative: 4 * 8 /(2 % 5) ==> 4 * ( 8 / 2) ==> 4 * 4 ==> 16
2 % 5
avalia para 2
, não 0
.
Se você está se referindo a "associatividade do operador" - é como uma linguagem determina como os operadores da mesma precedência são agrupados na ausência de parênteses.
Por exemplo, os operadores + e - em linguagens baseadas em C têm a mesma precedência. Quando você escreve uma expressão que usa os dois (sem parênteses), o compilador deve determinar em qual ordem avaliá-los.
Se você escrever 12 - 5 + 3, as avaliações possíveis incluem:
Dependendo da ordem em que você avalia a expressão, você pode obter resultados diferentes. Em linguagens baseadas em C, + e - têm associatividade à esquerda, o que significa que a expressão acima seria avaliada como o primeiro caso.
Todas as linguagens têm regras fortemente definidas para precedência e associatividade. Você pode aprender mais sobre as regras para C # aqui. Os conceitos gerais de associatividade e precedência do operador são bem abordados na Wikipedia.
é a ordem de avaliação para operadores de mesma precedência. A ordem da ESQUERDA PARA A DIREITA ou DA DIREITA PARA A ESQUERDA é importante. Para
3 - 2 - 1
se for da ESQUERDA para a DIREITA, então é
(3 - 2) - 1
e é 0. Se for DIREITO para ESQUERDO, então é
3 - (2 - 1)
e é 2. Na maioria das linguagens, dizemos que o operador menos tem uma associatividade da ESQUERDA PARA A DIREITA.
A situação sobre 3 - 2 - 1
pode parecer trivial, se a afirmação for, "é claro que fazemos da esquerda para a direita". Mas em outros casos, como se feito em Ruby ou em NodeJS:
$ irb
2.6.3 :001 > 2 ** 3 ** 2
=> 512
O **
operador está "ao poder de". A associatividade é da direita para a esquerda. E isso é
2 ** (3 ** 2)
que é 2 ** 9
, ou seja 512
, em vez de
(2 ** 3) ** 2
que é 8 ** 2
, ou seja 64
,.
Suponho que você quer dizer associatividade do operador ...
É a ordem de vinculação de operandos a um operador. Basicamente:
a - b + c
pode ser avaliado como (assumindo que - e + tenham a mesma precedência):
((a - b) + c) ou,
(a - (b + c))
Se os operadores forem associativos à esquerda (vinculam imediatamente ao operando à esquerda), ele será avaliado como o primeiro. Se eles forem associativos corretos, será avaliado como o segundo.
Todos nós sabemos que a precedência é importante, mas também a associatividade na interpretação do significado de uma expressão. Para uma introdução realmente simples, experimente Power of Operators .
A associatividade está sob a ordem de computação nos conceitos de linguagem de programação. A ordem de cálculo determina o significado da expressão. Tem duas regras principais,
- Regras de precedência
- Regras de associatividade
as regras de precedência definem a ordem na qual os operadores "adjacentes" de diferentes tipos são avaliados. Cada linguagem de programação tem sua própria tabela de precedência de operadores em relação a seus operadores.
Voltando à associatividade,
Ele define a ordem de execução das operações adjacentes com a mesma precedência. Tem 3 sabores,
deixou-associatividade
direito do associatividade
não associatividade
Se um operador for associativo à esquerda, ele avalia da esquerda para a direita da mesma forma, se for associativo à direita, ele avalia da direita para a esquerda.