2009-05-30 34 views
61

¿Qué es la asociatividad (para un operador) y por qué es importante?¿Qué es la asociatividad de los operadores y por qué es importante?

Actualizado: asociatividad de operadores

+2

¿Qué tipo de asociatividad? Asociatividad del operador? – Ikke

+1

-1: vago. ¿Alguna pista sobre el contexto o sobre qué quieres saber? –

+16

@Neil Butterworth - Ese es un comentario particularmente duro para lo que parece ser una pregunta razonable. El objetivo del sitio es ser un repositorio central para TODOS los conocimientos de programación, incluidas las cosas cubiertas en los textos introductorios. En cuanto a su comentario sobre la respuesta de @Jian Lin a su propio comentario que también es aceptable como se establece en la primera pregunta de las preguntas frecuentes oficiales. Alguien con su nivel de representante debería saberlo mejor. Si no está de acuerdo con eso, al menos sea civil al respecto. –

Respuesta

65

Para los operadores, la asociatividad significa que cuando aparece el mismo operador en una fila, entonces qué ocurrencia del operador aplicamos primero.En lo que sigue, vamos Q ser el operador

a Q b Q c 

Si Q es asociativos por la izquierda, entonces se evalúa como

(a Q b) Q c 

Y si es asociativa derecha, entonces se evalúa como

a Q (b Q c) 

Es importante, ya que cambia el significado de una expresión. Considere el operador de división con la aritmética de enteros, que se deja asociativo

4/2/3 <=> (4/2)/3 <=> 2/3  = 0 

Si fuera asociativa derecha, se evaluaría a una expresión indefinida, ya que hay que dividir por cero

4/2/3 <=> 4/(2/3) <=> 4/0  = undefined 
+0

¿sabe cómo encontrar asociatividad ya sea es izquierda o derecha para una determinada gramática? – user2510115

+1

si la gramática tiene una regla de producción recursiva izquierda/derecha. –

+0

Por ejemplo 'expr -> expr + term;' se deja asociativo y 'expr -> term + expr' es asociativo correcto. –

2

supongo que te refieres asociatividad de operadores ...

Es el orden de unión de operandos de un operador. Básicamente:

a - b + c

podrían ser evaluados como (asumiendo - y + tener la misma prioridad):

((a - b) + c) o,
(a - (b + c))

Si los operadores se dejan asociativos (se vinculan inmediatamente al operando izquierdo), se evaluará como el primero. Si son correctos asociativos, se evaluarán como el segundo.

7

Hay tres tipos de asociatividad:

The Associative property in mathematics

Order of Operations in programming languages

Associativity in CPU caches.

la propiedad asociativa en matemáticas es una propiedad de los operadores como de suma (+). Esta propiedad le permite reorganizar paréntesis sin cambiar el valor de una declaración, es decir:

(a + b) + c = a + (b + c) 

En lenguajes de programación, la asociatividad (o fijación) de un operador es una propiedad que determina cómo se agrupan los operadores con la misma precedencia en el ausencia de paréntesis; es decir, en qué orden se evalúa cada operador. Esto puede diferir entre los lenguajes de programación.

En cachés de CPU, la asociatividad es un método para optimizar el rendimiento.

+0

* la asociatividad (o fijeza) de un operador es una propiedad que determina cómo los operadores de la misma precedencia se agrupan en ausencia de paréntesis * - esa frase fue simplemente perfecta para hacerme entender –

1

Si se refiere a la asociatividad del operador:

Define la forma en que se analizan las expresiones. Da un estándar, por lo que cada expresión se analiza de la misma manera.

Es sobre todo importante para las operaciones que tienen el mismo precedense, cuando podría haber efectos secundarios.

3

es el orden de evaluar para operadores de la misma precedencia. El orden de IZQUIERDA A DERECHA o DERECHA A IZQUIERDA importa. Para

3 - 2 - 1 

si se izquierda a derecha, entonces es

(3 - 2) - 1 

y es 0. Si se trata de derecha a izquierda, entonces es

3 - (2 - 1) 

y es 2 En la mayoría de los lenguajes, decimos que el operador menos tiene una asociatividad de IZQUIERDA A DERECHA.

+3

Si usted ya sabía la respuesta, entonces ¿por qué se hace la pregunta? –

+2

fue para ayudar a gente nueva. Recuerdo haber aprendido C hace mucho tiempo y no sabía qué era la asociatividad hasta mucho después. –

+3

Sospecho que la mayoría de las personas que aprenden C pueden prescindir de su "ayuda". –

4

Si se refiere a "asociatividad de operador", es la forma en que un lenguaje determina cómo se agrupan los operadores de la misma precedencia en ausencia de paréntesis.

Por ejemplo, los operadores + y - en los idiomas basados ​​en C tienen la misma precedencia. . Cuando se escribe una expresión que utiliza dos de ellos (sin paréntesis) el compilador debe determinar qué fin de evaluar en

Si escribe 12 - 5 + 3, las posibles evaluaciones incluyen:

  1. (12 - 5) + 3 = 10
  2. 12 - (5 + 3) = 4

Dependiendo de la orden a evaluar la expresión, puede obtener resultados diferentes. En los lenguajes basados ​​en C, + y - han dejado asociatividad, lo que significa que la expresión anterior se evaluaría como el primer caso.

Todos los idiomas tienen reglas muy definidas para la precedencia y la asociatividad. Puede obtener más información sobre las reglas para C# aquí. Los conceptos generales del operador associativity y precedence están bien cubiertos en wikipedia.

+0

Sus ejemplos serían más claros si todos usaran los mismos operandos. –

+0

¿Qué pasaría si dos operadores con la misma precedencia aparecieran en una expresión sin parantheses, pero uno de ellos había dejado asociatividad y el otro tenía razón? ¿Usaría simplemente la asociatividad de cualquier operador que encuentre primero? – Hector

0

La mayoría de los ejemplos anteriores han usado constantes. Si los argumentos resultan ser llamadas a funciones, el orden en que se realizan las llamadas puede estar determinado por las reglas de asociación, dependiendo por supuesto de su compilador. Y si esas funciones tienen efectos secundarios ...

0

Todos sabemos que la precedencia es importante, pero también lo es la asociatividad en la interpretación del significado de una expresión.Para una introducción realmente simple, prueba Power of Operators.

2

¡¡Simple !! Izquierda Asociativa significa que evaluamos nuestra expresión de izquierda a derecha.

derecho asociativo significa evaluamos nuestra expresión de derecha a izquierda.

Sabemos que *,/y% tienen la misma precedencia, pero de acuerdo con la asociatividad la respuesta puede cambiar.

Por ejemplo: Tengo exp: 4 * 8/2% 5

asociativo Izquierda: (4 * 8)/2% 5 ==> (32/2)% 5 ==> 16 5% ==> 1

asociativo derecha: 4 * 8/(2% 5) comportamiento ==> 4 * (8/0) ==> No definido

espero que esto ayudaría. . .

Cuestiones relacionadas