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)?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top