¿Por qué el operador condicional es un derecho asociativo?

Puedo entender por qué el operador de asignación es correcto asociativo. Tiene sentido que cuando

x = 4 + 3 

se evalúa, que 4 y 3 se agregan antes de asignarse a x.

No estoy seguro de cómo? se beneficiaría de ser una asociación correcta. ¿Solo importa cuando dos? s fueron utilizados como este

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

Entonces se evalúa así:

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

Seguramente tendría más sentido evaluar de izquierda a derecha?

Si se evaluó de izquierda a derecha, se vería así:

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

Es decir, usaría el resultado del primer condicional ( a o b ) como condición booleana del segundo condicional. Eso no tiene mucho sentido: es como decir:

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

Aunque tal vez algún día quieras hacer exactamente esto, es mucho más probable que cada uno de ellos ?: para agregar más condiciones, como if / else if / else if / else , que es lo que produce el enlace asociativo correcto :

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

En cualquier idioma con un operador ternario asociativo correcto, puede astackrlos y construir una expresión if-elseif-elseif-else, como esta:

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

Por el contrario, en los idiomas con un operador ternario asociativo de la izquierda (como PHP, thanks @ user786653), debe aplicar explícitamente el bash antes mencionado entre paréntesis:

  

Tienes el concepto de asociatividad equivocado.

Cuando se dice que el operador + es asociativo de la izquierda, esto significa que a + b + c es equivalente a (a + b) + c , en oposición a a + (b + c) .

El operador = tiene una asociación correcta, lo que significa que a = b = c es equivalente a a = (b = c) , en oposición a (a = b) = c .

La asociatividad no tiene nada que ver con el orden de evaluación.