2015-06-04 4 views
3

Во-первых, я наткнулся на этот вопрос в последнее время и не будучи в состоянии найти хорошее объяснение для этого:Условные операции Тройные

int x = (30 > 15)?(14 > 4) ? 1 : 0 : 2; 

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

if (con1) or (con2) return 1   // if one is correct  
if (!con1) and (!con2) return 0  // if none are correct  
if (con1) not (con2) return 2  // if one but not the other 

как я сказал, я не знаю, так что я мог бы быть миллион миль.

+0

Я выбрал Тед HOPP ответ, поскольку это дает немного больше ясности .. Спасибо, но только, чтобы быть ясно, это называется вложенным трехкомпонентное состояние? – DVN

+0

Я не думаю, что для этой конструкции существует определенное стандартное имя, но да, «вложенные троичные операторы» или аналогичный язык были бы понятны большинству людей. Идея состоит в том, что структура тернарного оператора - '? : '- разрешает любое выражение после'? 'Или': ', включая другие выражения тернарного оператора. –

ответ

4

Из-за operator precedence in Java этот код:

int x = (30 > 15)?(14 > 4) ? 1 : 0 : 2; 

будет анализироваться, как если бы это были круглые скобки следующим образом:

int x = (30 > 15) ? ((14 > 4) ? 1 : 0) : 2; 

(единственный операторы с более низким приоритетом, чем тройной ?: различные операторы присваивания: =, += и т.д.) Ваш код может быть выражен в устной форме, как:

  • , если (con1) и (CON2) назначить 1 х
  • , если (con1) и (не CON2) присвоить-х
  • иначе присвоят 2 х

EDIT: Вложенные тройные операторы часто отформатированы особым образом, чтобы сделать все, что легче читать, особенно, когда они более чем два глубоко:

int x = condition_1 ? value_1  : 
     condition_2 ? value_2  : 
      . 
      . 
      . 
     condition_n ? value_n  : 
         defaultValue; // for when all conditions are false 

Это не так чисто, если вы хотите использовать тройное выражение для одной из частей «?». Общепринято изменить смысл условия, чтобы сохранить вложенность в частях «:», но иногда вам нужно вложенность в обе ветви. Таким образом, ваш пример заявление может быть переписано в виде:

int x = (30 <= 15) ? 2 : 
     (14 > 4) ? 1 : 
        0 ; 
4

Это int x = (30 > 15)?((14 > 4) ? 1 : 0): 2;:

if (30 > 15) { 
    if (14 > 4) 
     x = 1; 
    else 
     x = 0; 
} else { 
    x = 2; 
} 
Смежные вопросы