2009-05-30 12 views
61

Che cos'è l'associatività (per un operatore) e perché è importante?Che cos'è l'associatività degli operatori e perché è importante?

Aggiornato: di associatività

+2

Che tipo di associatività? Associatività dell'operatore? – Ikke

+1

-1: vago. Qualche suggerimento sul contesto o su cosa vuoi sapere? –

+16

@Neil Butterworth - Questo è un commento particolarmente duro per quella che sembra una domanda ragionevole. L'intero punto del sito deve essere un archivio centrale per TUTTE le conoscenze di programmazione comprese le cose trattate nei testi introduttivi. Per quanto riguarda il tuo commento su @Jian Lin's che risponde al suo stesso commento, anche questo è accettabile come esposto nella prima domanda delle FAQ ufficiali. Qualcuno con il tuo livello di reputazione dovrebbe sapere meglio. Se non sei d'accordo, almeno sii civile a riguardo. –

risposta

65

Per gli operatori, l'associatività indica che quando lo stesso operatore viene visualizzato in una riga, quindi quale occorrenza dell'operatore viene applicata per prima.Nel seguito, cerchiamo Q essere l'operatore

a Q b Q c 

Se Q è associativa a sinistra, poi si valuta come

(a Q b) Q c 

E se è associativa a destra, poi si valuta come

a Q (b Q c) 

È importante, poiché cambia il significato di un'espressione. Si consideri l'operatore di divisione con aritmetica intera, lasciato associativo

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

Se fosse associativa giusto, sarebbe valutato come un'espressione indefinita, dal momento che sarebbe dividere per zero

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

sai come trovare l'associatività se è sinistra o destra per grammer dato? – user2510115

+1

se la grammatica ha una regola di produzione ricorsiva sinistra/destra. –

+0

Ad esempio "espr -> expr + term;" è associativo a sinistra e "espr -> term + expr" è associativo giusto. –

2

suppongo che voi dire di associatività ...

E 'l'ordine di legame di operandi ad un operatore. Fondamentalmente:

a - b + c

potrebbe essere calcolato come (assumendo - e + hanno la stessa priorità):

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

Se gli operatori sono associati in modo associativo (eseguono il binding immediatamente sull'operando di sinistra), verrà valutato come il primo. Se hanno ragione associativa, sarà valutato come il secondo.

7

ci sono tre tipi di associatività:

The Associative property in mathematics

Order of Operations in programming languages

Associativity in CPU caches.

la proprietà associativa in matematica è una proprietà di operatori come l'addizione (+). Questa proprietà consente di riorganizzare parentesi senza modificare il valore di una dichiarazione, vale a dire:

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

Nei linguaggi di programmazione, l'associatività (o fissità) di un operatore è una proprietà che determina come operatori con la stessa precedenza vengono raggruppati nell'assenza di parentesi; cioè in quale ordine viene valutato ciascun operatore. Questo può variare tra i linguaggi di programmazione.

Nella cache della CPU, l'associatività è un metodo per ottimizzare le prestazioni.

+0

* l'associatività (o fissità) di un operatore è una proprietà che determina come gli operatori della stessa precedenza sono raggruppati in assenza di parentesi * - quella frase era perfetta per farmi capire –

1

Se vuoi dire di associatività:

Esso definisce il modo in cui le espressioni vengono analizzati. Dà uno standard, quindi ogni espressione viene analizzata nello stesso modo.

È soprattutto importante per le operazioni che hanno lo stesso precedente, quando potrebbero verificarsi effetti collaterali.

3

è l'ordine di valutare per gli operatori della stessa precedenza. L'ordine da sinistra a destra o da destra a sinistra conta. Per

3 - 2 - 1 

se viene da sinistra a destra, allora è

(3 - 2) - 1 

ed è 0. Se è da destra a sinistra, allora è

3 - (2 - 1) 

ed è 2 Nella maggior parte delle lingue, diciamo che l'operatore meno ha un'associatività da SINISTRA A DESTRA.

+3

Se si sapeva già la risposta, allora perché si pone la domanda? –

+2

era di aiutare le nuove persone. Ricordo di aver imparato C molto tempo fa e non sapevo cosa fosse realmente l'associatività fino a dopo. –

+3

Sospetto che la maggior parte delle persone che apprendono C possa fare a meno del tuo "aiuto". –

4

Se ci si riferisce all '"associatività dell'operatore", è come una lingua determina come gli operatori della stessa precedenza sono raggruppati in assenza di parentesi.

Ad esempio, gli operatori + e - nelle lingue basate su C hanno la stessa precedenza. . Quando si scrive un'espressione che utilizza entrambi (senza parentesi) il compilatore deve determinare quale ordine di valutare loro in

Se si scrive 12-5 + 3, le possibili valutazioni comprendono:

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

seconda dell'ordine a valutare l'espressione, si possono ottenere risultati diversi. Nei linguaggi basati su C, + e - hanno lasciato l'associatività, il che significa che l'espressione sopra valuterà come primo caso.

Tutte le lingue hanno regole fortemente definite sia per la precedenza che per l'associatività. Puoi saperne di più sulle regole per C# qui. I concetti generali dell'operatore associativity e precedence sono ben trattati su wikipedia.

+0

I tuoi esempi sarebbero più chiari se usassero tutti gli stessi operandi. –

+0

Cosa succederebbe se due operatori con la stessa precedenza apparissero in un'espressione senza paranti, ma uno di essi aveva lasciato l'associatività e l'altro aveva ragione? Utilizzerebbe semplicemente l'associatività di quale operatore sempre trova prima? – Hector

0

La maggior parte degli esempi precedenti ha utilizzato le costanti. Se gli argomenti sono chiamate di funzione, l'ordine in cui vengono effettuate le chiamate può essere determinato dalle regole di associazione, a seconda ovviamente del compilatore. E se quelle funzioni hanno effetti collaterali ..

0

Sappiamo tutti che la precedenza è importante ma lo è anche l'associatività nell'interpretazione del significato di un'espressione.Per un'introduzione davvero semplice prova con Power of Operators.

2

Semplice !! Sinistro Associativo significa che valutiamo la nostra espressione da sinistra a destra.

Right Associative significa che valutiamo la nostra espressione da destra a sinistra.

Sappiamo *,/e% hanno la stessa precedenza, ma in base alla risposta di associatività può cambiare.

Per esempio: ho exp: 4 * 8/2% 5

associativa Sinistra: (4 * 8)/2% 5 ==> (32/2)% 5 ==> 16 % 5 ==> 1

associativa destra: 4 * 8/(2% 5) il comportamento ==> 4 * (8/0) ==> non definito

spero che questo sarebbe di aiuto. . .