Как называется оператор Java?: И что он делает? - PullRequest
138 голосов
/ 28 апреля 2009

Я работал с Java пару лет, но до недавнего времени я не сталкивался с этой конструкцией:

int count = isHere ? getHereCount(index) : getAwayCount(index);

Это, наверное, очень простой вопрос, но кто-нибудь может это объяснить? Как мне это прочитать? Я почти уверен, что знаю, как это работает.

  • если isHere верно, getHereCount() вызывается,
  • если isHere ложно getAwayCount() вызывается.

Правильно? Как называется эта конструкция?

Ответы [ 15 ]

176 голосов
/ 28 апреля 2009

Да, это сокращенная форма

int count;
if (isHere)
    count = getHereCount(index);
else
    count = getAwayCount(index);

Он называется условным оператором . Многие (ошибочно) называют его троичным оператором , потому что это единственный троичный оператор (с тремя аргументами) в Java, C, C ++ и, возможно, во многих других языках. Но теоретически может быть другим троичным оператором, тогда как может быть только один условный оператор .

Официальное название дано в Спецификации языка Java :

§15.25 Условный оператор? :

Условный оператор ? : использует логическое значение одного выражения, чтобы решить, какое из двух других выражений должно быть оценено.

Обратите внимание, что обе ветви должны приводить к методам с возвращаемыми значениями:

Ошибка времени компиляции, когда второе или третье выражение операнда является вызовом метода void.

Фактически, согласно грамматике операторов выражений ( §14.8 ), условное выражение не допускается в любом контексте, где вызов метода void может появляются.

Итак, если doSomething() и doSomethingElse() являются пустыми методами, вы не можете сжать это:

if (someBool)
    doSomething();
else
    doSomethingElse();

в это:

someBool ? doSomething() : doSomethingElse();

Простые слова:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 
30 голосов
/ 28 апреля 2009

Другие ответили на это в достаточной степени, но часто с именем «троичный оператор».

Будучи педантом, которым я являюсь, я хотел бы прояснить, что имя оператора является условным оператором или «условным оператором?». Это троичный оператор (в том смысле, что он имеет три операнда), и на данный момент это единственный троичный оператор в Java.

Тем не менее, спецификация довольно ясно , что ее имя является условным оператором или «условным оператором?», Чтобы быть абсолютно однозначным. Я думаю, что более понятно называть его по этому имени, поскольку оно указывает на поведение оператора в некоторой степени (оценивает условие), а не просто на то, сколько у него операндов.

17 голосов
/ 28 апреля 2009

В соответствии со спецификацией Sun Java он называется условным оператором. Смотрите раздел 15.25. Вы правы относительно того, что он делает.

условный оператор? : использует логическое значение одного выражения, чтобы решить, какое из двух других выражений должно быть оценено.

Условный оператор синтаксически справа ассоциативен (он группируется справа налево), так что a? B: c? D: e? F: g означает то же самое, что и a b: (c? D :( ? е е: г))

.
ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

Условный оператор имеет три выражения операнда; ? появляется между первым и вторым выражениями, а: появляется между вторым и третьим выражениями.

Первое выражение должно иметь тип boolean или Boolean, иначе произойдет ошибка времени компиляции.

5 голосов
/ 28 апреля 2009

Не совсем правильно, если быть точным:

  1. если isHere имеет значение true, результат getHereCount () равен , возвращается
  2. В противном случае результат getAwayCount () равен , возвращен

То, что "вернулся", очень важно. Это означает, что методы должны возвращать значение, и это значение должно быть назначено где-то.

Кроме того, не совсем синтаксически эквивалентно версии if-else. Например:

String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;

Если закодировано с if-else, всегда будет получаться больше байт-кода.

4 голосов
/ 28 апреля 2009
int count = isHere ? getHereCount(index) : getAwayCount(index);

означает:

if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}
3 голосов
/ 13 сентября 2015

Эта конструкция называется Тернарный оператор в области компьютерных наук и технологий программирования.
И Википедия предлагает следующее объяснение:

В информатике троичный оператор (иногда неправильно называемый третичным оператором) - это оператор, который принимает три аргумента. Аргументы и результат могут быть разных типов. Многие языки программирования, использующие C-подобный синтаксис, имеют троичный оператор?:, Который определяет условное выражение.

Этот синтаксис доступен не только в Java, но и в PHP, а также в Objective-C.

В следующей ссылке она дает следующее объяснение, которое приятно понять:

Тернарный оператор - это операция, выполняемая на 3 входах. Это сокращение для оператора if-else, также известное как условный оператор.

В Perl / PHP он работает как:
boolean_condition ? true_value : false_value

В C / C ++ это работает как:
logical expression ? action for true : action for false

Это может быть читаемо для некоторых логических условий, которые не слишком сложны, иначе лучше использовать Блок If-Else с предполагаемой комбинацией условной логики.

Мы можем упростить блоки If-Else с помощью этого троичного оператора для одной строки оператора кода.
Например:

if ( car.isStarted() ) {
     car.goForward();
} else {
     car.startTheEngine();
}

Может быть равно следующему:

( car.isStarted() ) ? car.goForward() : car.startTheEngine();

Итак, если мы ссылаемся на ваше утверждение:

int count = isHere ? getHereCount(index) : getAwayCount(index);

На самом деле это 100% эквивалент следующего блока If-Else :

int count;
if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}

Вот и все!
Надеюсь, что это было полезно для кого-то!
Ура!

3 голосов
/ 28 апреля 2009

троичный, условный; помидор, томат. Для чего это действительно ценно - это инициализация переменных. Если (как и я) вы любите инициализировать переменные там, где они определены, условный троичный оператор (для него обоих) позволяет вам делать это в тех случаях, когда существует условие относительно его значения. Особенно примечателен в конечных полях, но полезен и в других местах.

например:.

public class Foo {
    final double    value;

    public Foo(boolean positive, double value) {
        this.value = positive ? value : -value;
    }
}

Без этого оператора - по какому-либо имени - вам бы пришлось сделать поле не окончательным или написать функцию просто для его инициализации. На самом деле, это неправильно, его все равно можно инициализировать с помощью if иначе, по крайней мере, на Java. Но я нахожу это чище.

3 голосов
/ 28 апреля 2009
condition ? truth : false;

Если условие true, вернуть первый параметр. Если условие false, вернуть второй параметр.

Это называется Условный оператор , и это тип Тройная операция .

2 голосов
/ 25 апреля 2017

Его троичный оператор (?:)

The ternary operator is an operator that takes three arguments. The first 
argument is a comparison argument, the second is the result upon a true 
comparison, and the third is the result upon a false comparison.
2 голосов
/ 28 апреля 2009

Правильно. Это называется троичный оператор . Некоторые называют это условным оператором .

...