Почему оператор условного оператора является ассоциативным?
Я понимаю, почему оператор присваивания является правильным ассоциативным. Имеет смысл, что когда
x = 4 + 3
оценивается, что 4 и 3 добавляются перед назначением x.
Непонятно, как? выиграет от того, чтобы быть правильным ассоциативным. Это имеет значение только тогда, когда два? s были использованы как это
z = (a == b ? a : b ? c : d);
Затем он вычисляется следующим образом:
z = (a == b ? a : (b ? c : d));
Конечно, было бы разумнее оценивать слева направо?
Ответы
Ответ 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
.
Ассоциативность не имеет ничего общего с порядком оценки.