Quando materia associatività dell'operatore?
-
21-12-2019 - |
Domanda
La maggior parte dei linguaggi di programmazione ha una tabella di precedenza e associatività per gli operatori binari.Associatività conta in alcuni casi ad es.(a - b) - c
!= a - (b - c)
.
Tuttavia, per un operatore associativo come &&
sembrerebbe non importa, ma la maggior parte delle lingue elencano questo come Associativo sinistro.
Ci sono situazioni in cui c'è in realtà una differenza tra (a && b) && c
e a && (b && c)
?
Soluzione
Non posso credere che ci siano così tante risposte sbagliate (cancellate) ... forse dovrei rispondere a questo.
Prima di tutto, Precedenza!= Associatività!= Ordine di valutazione .
Ora che abbiamo questo fuori strada: le associatività contano in alcuni casi.
Per a + b + c
, importa quando a
, b
e c
sono numeri a virgola mobile anziché interi, poiché gli errori di arrotondamento si accumulano diversamente a seconda di come i termini sono raggruppati.
Per il caso particolare di &&
e ||
, non importa purché non siano sovraccaricati (che è possibile solo in C ++, non c), ma la lingua lo definisce ancora Solo per la coerenza - e in modo che la rappresentazione "albero" del codice (basata sulla grammatica) sia unica. Ciò funziona anche a vantaggio di C ++ poiché ora il significato di generatori sovraccaricati e &&
etagcode non è ambiguo.
Altri suggerimenti
Aggiunta a @ Mehrdads @ Risposta (che ho upvoted):
Se hai mai costruito un parser, noterai che i tuoi operatori devono avere un'associatività, altrimenti
a && b && c
.
sarebbe semplicemente un errore di sintassi.Supponendo che quanto sopra non dovrebbe essere un errore di sintassi, è necessario decidere se dovrebbe significare:
(a && b) && c
.
o
a && (b && c)
.
Non puoi semplicemente dire: non mi interessa.