Что означают два вопросительных знака подряд в троичном предложении?

#java #conditional-operator #ternary

#java #условный оператор #троичный

Вопрос:

Недавно я видел этот оператор троичной операции в фрагменте кода Java:

 int getVal(Integer number, boolean required) {
    Integer val = number == null ? required ? 1 : 2 : 3;
    return val;
}
 

Я никогда не видел троичного оператора с двумя вопросительными знаками подряд (без каких-либо круглых скобок). Если я играю с входными значениями, я могу получить 1 return if number == null и 3 return в противном случае, но, похоже, не имеет значения, что требуется, 2 никогда не возвращается.

Что означает это утверждение (т. Е. Как я должен читать его как словесное выражение true / false conditions ) и какие входные 2 данные должны быть возвращены?

Ответ №1:

Это просто вложенный троичный оператор. Понятнее путем добавления круглых скобок:

 number == null ? (required ? 1 : 2) : 3;
 

какими должны быть входные данные для возврата 2?

number = null и required = false

Комментарии:

1. Я согласен, круглые скобки делают вещи намного приятнее. Спасибо!

Ответ №2:

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

 Integer val = number == null ? (required ? 1 : 2) : 3;
 

Комментарии:

1. Я согласен, круглые скобки значительно облегчают чтение. Спасибо!

Ответ №3:

Выражение формы a ? b ? c : d : e использует условный оператор дважды. Единственная двусмысленность заключается в том, в каком порядке.

Это не может означать (a ? b) ? c : d : e , потому что это было бы синтаксической ошибкой.

Следовательно, это должно означать a ? (b ? c : d) : e .

То есть это эквивалентно:

 if (a) {
  if (b) {
    return c;
  } else {
    return d;
  }
} else {
  return e;
}
 

Более интересный случай

 a ? b : c ? d : e
 

что можно прочитать как

 (a ? b : c) ? d : e 
 

или

 a ? b : (c ? d : e)
 

Чтобы устранить эту двусмысленность, спецификация языка Java пишет:

Условный оператор синтаксически ассоциативен с правом (он группируется справа налево)

Комментарии:

1. К счастью, никогда не видел a ? b : c ? d : e в реальной кодовой базе / примере, выглядит страшно…

Ответ №4:

Спасибо @luk2302 и @racraman за ваши ответы! На основе изложенного вами понимания в скобках:

 Integer val = number == null ? (required ? 1 : 2) : 3;
 

Я просто хочу добавить, что способ «прочитать» это как утверждения истины:

 If opt == null and required == true: 1
If opt == null and required == false: 2
If opt != null: 3   // value of required doesn't matter
 

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

(Примечание: я не был уверен, было ли лучше опубликовать это как обновление вопроса или нет, но поскольку технически это «объяснение», казалось, что ответ был лучшим местом для этого. Если вам нравится мой ответ, пожалуйста, поддержите @luk2302 и @racraman, поскольку именно они вдохновили это дополнение)

Комментарии:

1. Вы сделали это правильно, разместив его в качестве ответа.

2. Спасибо @Andreas, я ценю заверение / подтверждение!

Ответ №5:

Следовало бы добавить скобки, это было бы понятнее для понимания

Integer val = number == null ? (required ? 1 : 2) : 3;

Это эквивалентно

 if (number == null)
{
    if (required == true)
    {
        return 1;
    }
    else 
    {
        return 2;
    }
}
else
{
    return 3;
}
 

Для возврата входных данных требуется 2
number = null и required = false