Еще один условный вопрос о вложенности операторов - PullRequest
6 голосов
/ 22 января 2011

В соответствии с таблицами приоритетов Си троичный условный оператор имеет ассоциативность справа налево.

Итак, может ли он быть непосредственно преобразован в эквивалентную лестницу if-else?

Например,Можно ли:

x?y?z:u:v;

интерпретировать как:

if(x)
{
   if(y)
   { z; }
   else
   { u; }
}
else
{ v; }

путем сопоставления else (:) с ближайшим непарным, если (?)?Или ассоциативность справа налево подразумевает какое-то другое расположение?

Ответы [ 2 ]

15 голосов
/ 22 января 2011

Пример, который вы привели, можно интерпретировать только одним способом (например, операторы if), независимо от того, имеет ли троичный оператор ассоциативность справа налево или слева направо.

Где ассоциативность справа налево имеет значение, когда у вас есть:

x = a ? b : c ? d : e;

Что интерпретируется как: x = a ? b : (c ? d : e), а не x = (a ? b : c) ? d : e.

Чтобы дать более реалистичный пример:

int getSign(int x) {
    return x < 0 ? -1 :
           x > 0 ?  1 :
                    0;
}

Это идентично (возможно, более читабельным) операторам if / else-if:

int getSign(int x) {
    if (x < 0)
         return -1;
    else if (x > 0)
         return 1;
    else return 0;
}
6 голосов
/ 22 января 2011

Ваше предположение верно;тем не менее, для удобства чтения часто целесообразно добавить в скобки, например:

x ? ( y ? z : u ) : v
...