Cos'è l'associatività degli operatori e perché è importante?


89

Cos'è l'associatività (per un operatore) e perché è importante?

Aggiornato: associatività degli operatori


2
Che tipo di associatività? Associatività degli operatori?
Ikke

26
@ Neil Butterworth - Questo è un commento particolarmente duro per quella che sembra una domanda ragionevole. Il punto centrale del sito è essere un archivio centrale per TUTTA la conoscenza della programmazione, comprese le cose trattate nei testi introduttivi. Per quanto riguarda il tuo commento sulla risposta di @Jian Lin al suo commento, anche questo è accettabile come indicato nella prima domanda delle FAQ ufficiali. Qualcuno con il tuo livello di ripetizione dovrebbe saperlo meglio. Se non sei d'accordo, almeno sii civile.
Rob Allen

1
@Rob Allen Vedi i suoi altri post. Inoltre, non ho detto che non avrebbe dovuto rispondere al suo post, solo che non è stato d'aiuto. E ti farò un patto: non ti dirò come formulare i tuoi post qui se non mi dici come esprimere i miei.

Risposte:


106

Per gli operatori, associatività significa che quando lo stesso operatore viene visualizzato in una riga, viene applicata per prima la ricorrenza dell'operatore. Di seguito, lascia che Qsia l'operatore

a Q b Q c

Se Qè associativo a sinistra, viene valutato come

(a Q b) Q c

E se è associativo corretto, valuta come

a Q (b Q c)

È importante, poiché cambia il significato di un'espressione. Considera l'operatore di divisione con aritmetica dei numeri interi, che è associativo a sinistra

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

Se fosse associativo corretto, restituirebbe un'espressione indefinita, poiché dividerebbe per zero

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

sai come trovare l'associatività se è sinistra o destra per una data grammatica?
user2510115

1
Ad esempio expr -> expr + term;è associativo a sinistra ed expr -> term + exprè associativo a destra.
Subin Sebastian

15
Nella prima riga della risposta, invece di "quando appare lo stesso operatore" è più appropriato dire "quando compaiono operatori con la stessa precedenza". Esempio: a * b / c => dove * e / hanno la stessa precedenza.
1O1

2
@ 1O1 grazie, ma cosa succede se quegli operatori con la stessa precedenza hanno un'associatività diversa? Come a * b / cvaluterebbe se *sarebbe associativo a sinistra ma /associativo a destra? Poi c'è una contraddizione. Quindi penso che sia necessario dire "quando operatori con la stessa precedenza e associatività" se si desidera coprire più operatori.
Johannes Schaub - litb

2
@ Mark non lo so, ma non riesco a pensare a come dovrebbe funzionare. Probabilmente vale la pena fare una domanda extra
sullo stackoverflow

13

Esistono tre tipi di associatività:

La proprietà associativa in matematica

Ordine delle operazioni nei linguaggi di programmazione

Associatività nelle cache della CPU.

La proprietà Associative in matematica è una proprietà di operatori come l'addizione (+). Questa proprietà consente di riorganizzare le parentesi senza modificare il valore di un'istruzione, ovvero:

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

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

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


3
l'associatività (o fissità) di un operatore è una proprietà che determina come gli operatori con la stessa precedenza vengono raggruppati in assenza di parentesi - quella frase era perfetta per farmi capire
Rafael Eyng

7

Semplice!!

Left Associative means we evaluate our expression from left to right

Right Associative means we evaluate our expression from right to left 

Sappiamo che *, / e% hanno la stessa precedenza, ma in base all'associatività, la risposta potrebbe cambiare:

Ad esempio: abbiamo l'espressione: 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
Sembra che ci sia un errore nella risposta: 2 % 5restituisce 2, no 0.
6005

6

è l'ordine di valutazione per operatori con la stessa precedenza. L'ordine DA SINISTRA A DESTRA o DA DESTRA A SINISTRA è importante. Per

3 - 2 - 1

se è da SINISTRA a DESTRA, allora lo è

(3 - 2) - 1

ed è 0. Se va da DESTRA a SINISTRA, allora lo è

3 - (2 - 1)

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

Aggiornamento 2020:

La situazione 3 - 2 - 1potrebbe sembrare banale, se l'affermazione è "ovviamente lo facciamo da sinistra a destra". Ma in altri casi, come se fatto in Ruby o in NodeJS:

$ irb
2.6.3 :001 > 2 ** 3 ** 2
 => 512 

L' **operatore è "al potere di". L'associatività va da destra a sinistra. E questo è

 2 ** (3 ** 2)

che è 2 ** 9, cioè 512, invece di

(2 ** 3) ** 2

che è 8 ** 2, ad esempio, 64.


4
Se conoscevi già la risposta, perché hai posto la domanda?
Robert Harvey,

6
era per aiutare nuove persone. Ricordo di aver imparato C molto tempo fa e non sapevo cosa fosse realmente l'associatività fino a più tardi.
nonopolarità

3
Sospetto che la maggior parte delle persone che imparano il C possa fare a meno del tuo "aiuto".

1
hm, ad esempio, l'associatività è limitata allo stesso operatore o è per gli operatori sullo stesso livello di precedenza? Molte persone possono rispondere con certezza senza controllare libri o riferimenti?
nonopolarità

13
@ Neil Butterworth, perché così ostile? Penso che sia accettabile pubblicare una risposta alla tua stessa domanda. Questo è nelle FAQ ed è stato menzionato più volte nel podcast.
Jay Conrod

5

Se ti riferisci all '"associatività degli operatori", è il modo in cui una lingua determina il modo in cui gli operatori con la stessa precedenza vengono raggruppati in assenza di parentesi.

Ad esempio, gli operatori + e - nei linguaggi basati su C hanno la stessa precedenza. Quando scrivi un'espressione che li utilizza entrambi (senza parentesi), il compilatore deve determinare in quale ordine valutarli.

Se scrivi 12 - 5 + 3, le possibili valutazioni includono:

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

A seconda dell'ordine in cui valuti l'espressione, puoi ottenere risultati diversi. Nei linguaggi basati su C, + e - hanno lasciato l'associatività, il che significa che l'espressione sopra sarebbe valutata come il primo caso.

Tutti i linguaggi hanno regole ben definite sia per la precedenza che per l'associatività. Puoi saperne di più sulle regole per C # qui. I concetti generali di associatività e precedenza degli operatori sono ben trattati su wikipedia.


I tuoi esempi sarebbero più chiari se utilizzassero tutti gli stessi operandi.
Michael Carman

Cosa succederebbe se due operatori con la stessa precedenza apparissero in un'espressione senza parentesi, ma uno di loro avesse l'associatività sinistra e l'altro avesse destra? Userebbe semplicemente l'associatività dell'operatore che trova per primo?
Ettore

non può accadere poiché la stessa precedenza significa la stessa associatività. se così fosse, potrebbero esserci ambiguità che minacciano l'esistenza stessa della realtà.
Ankur S

3

Presumo tu intenda associatività degli operatori ...

È l'ordine di associazione degli operandi a un operatore. Fondamentalmente:

a - b + c

potrebbe essere valutato come (supponendo - e + abbiano la stessa precedenza):

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

Se gli operatori sono associativi a sinistra (si legano immediatamente all'operando sinistro), verrà valutato come primo. Se sono giuste associative, verrà valutato come il secondo.


1

Se intendi associatività degli operatori:

Definisce il modo in cui vengono analizzate le espressioni. Fornisce uno standard, quindi ogni espressione viene analizzata allo stesso modo.

È importante soprattutto per le operazioni che hanno la stessa precedenza, quando potrebbero esserci effetti collaterali.


0

La maggior parte degli esempi precedenti utilizzava costanti. Se gli argomenti sono chiamate di funzioni, l'ordine in cui vengono effettuate le chiamate può essere determinato dalle regole di associazione, a seconda ovviamente del compilatore. E se queste 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 Power of Operators .


0

L'associatività rientra nell'ordine del calcolo nei concetti del linguaggio di programmazione. L'ordine di calcolo determina il significato dell'espressione. Ha due regole principali,

  1. Regole di precedenza
  2. Regole di associatività

le regole di precedenza definiscono l'ordine in cui vengono valutati gli operatori "adiacenti" di diverso tipo. Ogni linguaggio di programmazione ha la propria tabella di precedenza degli operatori rispetto ai propri operatori.

Tornando all'associatività,

Definisce l'ordine di esecuzione delle operazioni adiacenti con la stessa precedenza. Ha 3 gusti,

associatività a sinistra associatività a
destra
non associatività

Se un operatore è associativo a sinistra, valuta da sinistra a destra, allo stesso modo se è associativo a destra valuta da destra a sinistra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.