2011-01-22 2 views
5

В соответствии с таблицами приоритетов C тернарный условный оператор имеет правоотносную ассоциацию .Еще один Условный оператор, вложенный в вопрос

Итак, он напрямую конвертируется в эквивалентную лестницу if-else?

Например, Can:

x?y?z:u:v; 

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

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

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

ответ

14

пример вы дали могли быть интерпретированы только в одну сторону (как если заявления вы дали), имел ли тройная оператор справа левая или левая-правая ассоциативность.

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

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; 
} 

Это идентично (вероятно, более удобным для чтения), если/иначе, если заявления:

int getSign(int x) { 
    if (x<0) 
     return -1; 
    else if (x>0) 
     return 1; 
    else 
     return 0; 
} 
5

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

x?(y?z:u):v 
+2

+1 хотя я бы сказал, даже wiser * not * для установки условных операторов в реальном коде производства :-) –

+0

@ Péter Török: Согласен! – Ray

+3

Я думаю, что «не используется» переоценено. Замените '?' На 'then' и': 'на' else', и у вас есть вполне допустимый синтаксис выбора на нескольких языках. Я все время пишу вложенные условные обозначения, убедившись, что каждый новый? и: появляется на новой строке с правильным отступом. Это так же читаемо, как и любые блоки if/else. –