Выражение
int result = x?y:a?b:c;
может быть записано как
int result;
if (x)
{
result = y;
}
else
{
if (a)
{
result = b;
}
else
{
result = c;
}
}
. Поэтому сначала необходимо оценить x
, чтобы определить, будет ли блок if
или else
быть выполненным.
Обратите внимание, что троичный оператор вычисляет только то выражение, которое ему необходимо.Когда x
истинно, y
оценивается.Когда x
ложно, подвыражение a?b:c
оценивается.
Фактически, стандарт C требует, чтобы код оценивал только необходимое выражение.Вот что говорится в разделе 6.5.15 / p4:
Первый операнд вычисляется;между оценкой и оценкой второго или третьего операнда существует точка последовательности (в зависимости от того, что оценивается).Второй операнд оценивается, только если первый сравнивается с неравным 0;третий операнд оценивается, только если первый сравнивается равным 0;Результатом является значение второго или третьего операнда (в зависимости от того, что оценивается), преобразованное в тип, описанный ниже.
В выражении x?y:a?b:c
,
- первый операнд
x
- второй операнд
y
- третий операнд
a?b:c
Таким образом, стандарт прямо запрещает выполнение кода кодомлюбая часть a?b:c
, если x
не сравнивается равным 0.
Ассоциативность определяет только то, как операнды интерпретируются.Первый, второй и третий операнды, перечисленные выше, основаны на ассоциативности справа налево.
Если ассоциативность троичного оператора была слева направо, то
- первый операнд будет
x?y:a
- второй операнд будет
b
- третий операнд будет
c