Подтвердить что ты не робот

Почему оператор условного оператора является ассоциативным?

Я понимаю, почему оператор присваивания является правильным ассоциативным. Имеет смысл, что когда

x = 4 + 3

оценивается, что 4 и 3 добавляются перед назначением x.

Непонятно, как? выиграет от того, чтобы быть правильным ассоциативным. Это имеет значение только тогда, когда два? s были использованы как это

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

Затем он вычисляется следующим образом:

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

Конечно, было бы разумнее оценивать слева направо?

4b9b3361

Ответ 1

Если он оценивается слева направо, он выглядит следующим образом:

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

То есть он использовал бы результат первого условного (a или b) как булево условие второго условного выражения. Это не имеет особого смысла: это как сказать:

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

Хотя, возможно, однажды вам захочется сделать именно это, гораздо более вероятно, что каждый следующий ?: должен добавить дополнительные условия, например if/else if/else if/else, что дает право-ассоциативное связывание:

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

Ответ 2

На любом языке с правильным ассоциативным тернарным оператором вы можете складывать их и строить выражение if-elseif-elseif-else, например:

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

Напротив, на языках с левым ассоциативным тернарным оператором (например, PHP, thanks @user786653) вам необходимо явно применить вышеупомянутое намерение с помощью круглых скобок:

<?php
// This will output 't', not 'true'.
echo (true ? 'true' : false ? 't' : 'f');

// the following is a more obvious version of the same code as above
echo ((true ? 'true' : false) ? 't' : 'f');

// here, you can see that the first expression is evaluated to 'true', which
// in turn evaluates to (bool)true, thus returning the true branch of the
// second ternary expression.
?>

Ответ 3

У вас неправильная концепция ассоциативности.

Когда оператор + называется лево-ассоциативным, это означает, что a + b + c эквивалентно (a + b) + c, в отличие от a + (b + c).

Оператор = является право-ассоциативным, что означает, что a = b = c эквивалентно a = (b = c), в отличие от (a = b) = c.

Ассоциативность не имеет ничего общего с порядком оценки.