Perché l’operatore condizionale è associato all’associazione?

Riesco a capire perché l’operatore di assegnazione abbia ragione associativo. Ha senso che quando

x = 4 + 3 

viene valutato, che 4 e 3 vengono aggiunti prima di essere assegnati a x.

Non sono chiaro su come? trarrebbe vantaggio dall’essere associativi giusti. Importa solo quando due? s sono stati usati così

 z = (a == b ? a : b ? c : d); 

Quindi viene valutato in questo modo:

 z = (a == b ? a : (b ? c : d)); 

Sicuramente avrebbe più senso valutare da sinistra a destra?

Se valutato da sinistra a destra, sarebbe simile a questo:

 z = ((a == b ? a : b) ? c : d); 

Cioè, userebbe il risultato del primo condizionale ( a o b ) come condizione booleana del secondo condizionale. Non ha molto senso: è come dire:

 int z, tmp; /* first conditional */ if(a == b) tmp = a; else tmp = b; /* second conditional */ if(tmp) z = c; else z = d; 

Mentre forse un giorno vorresti fare esattamente questo, è molto più probabile che ciascuno ?: Quello che segue è inteso per aggiungere più condizioni, come if / else if / else if / else , che è ciò che produce l’associazione associativa a destra :

 int z; /* first conditional */ if(a == b) z = a; else /* second conditional */ if(b) z = c; else z = d; 

In qualsiasi lingua con un operatore ternario associativo destro, puoi impilarli e creare un’espressione if-elseif-elseif-else, in questo modo:

 val = a == 0 ? 1: a == 1 ? 2: 4; 

Al contrario, nelle lingue con un operatore ternario associativo sinistro (come PHP, grazie @ user786653) è necessario applicare esplicitamente l’intento sopramenzionato con parentesi:

  

Hai sbagliato il concetto di associatività.

Quando si dice che l’operatore + è associativo a sinistra, ciò significa che a + b + c è equivalente a (a + b) + c , invece che a a + (b + c) .

L’operatore = è a destra-associativa, il che significa che a = b = c è equivalente a a = (b = c) , al contrario di a (a = b) = c .

L’associatività non ha nulla a che fare con l’ordine di valutazione.