Что такое оператор Java?: И что он делает?

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

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

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

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

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

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

в это:

someBool ? doSomething() : doSomethingElse();

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

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

Ответ 2

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

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

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

Ответ 3

В соответствии с Sun Java Specification он называется Условным оператором. См. Раздел 15.25. Вы правы в том, что он делает.

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

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

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

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

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

Ответ 4

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

  • if isHere is true, результат getHereCount() возвращен
  • иначе результат getAwayCount() возвращен

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

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

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

Если кодировка с if-else всегда приведет к большему байт-коду.

Ответ 5

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

означает:

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

Ответ 7

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

например:.

public class Foo {
    final double    value;

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

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

Ответ 8

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

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

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

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

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

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

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

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

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

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

Что это!
Надеюсь, это помогло кому-то!
Ура!

Ответ 9

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

Ответ 10

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

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.

Ответ 11

Вас может заинтересовать предложение для некоторых новых операторов, которые похожи на условный оператор. Операторы с нулевым безопасностью будут включать такой код:

String s = mayBeNull?.toString() ?: "null";

Было бы особенно удобно, когда происходит автоматическое разблокирование.

Integer ival = ...;  // may be null
int i = ival ?: -1;  // no NPE from unboxing

Он был выбран для дальнейшего рассмотрения в рамках JDK 7 "Монета проекта".

Ответ 12

На самом деле это может принимать более трех аргументов. Например, если мы хотим проверить, что число положительное, отрицательное или ноль, мы можем это сделать:

String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT ZERO.";

что лучше, чем использование if, else if, else.

Ответ 13

Да, вы правы.?: обычно называется "тернарным условным оператором", который часто называют просто "тройным оператором". Это сокращенная версия стандарта if/else условная.

Тернарный условный оператор

Ответ 14

Это условный оператор, и это больше, чем просто сжатый способ написания операторов if.

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

Ответ 15

Мне действительно нравится этот оператор, но читатель должен быть принят во внимание.

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

Прежде всего, есть исходный случай Аскера. Он просто потратил час, разместив об этом и прочитав ответы. Как долго он должен был писать автору каждый?: Как if, то на протяжении всей его жизни. Не час, чтобы быть уверенным.

Во-вторых, в C-подобных языках вы получаете привычку просто знать, что условные обозначения - это первое, что есть в строке. Я заметил это, когда я использовал Ruby и наткнулся на строки вроде:

callMethodWhatever(Long + Expression + with + syntax) if conditional

Если бы я был долгое время пользователем Ruby, у меня, вероятно, не было бы проблемы с этой строкой, но, исходя из C, когда вы видите "callMethodWhatever" в качестве первой вещи в строке, вы ожидаете, что она будет выполнена.?? Менее загадочно, но все еще достаточно необычно, чтобы вытащить читателя.

Преимущество, однако, - это действительно крутое чувство в вашем животике, когда вы можете написать оператор с 3 строками if в пространстве 1 строки. Не могу отрицать этого:) Но, честно говоря, не обязательно более читаемый 90% людей там просто из-за своей "редкости".

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

Ответ 16

Условные выражения выполняются в совершенно другом стиле, без явного выражения if.

Синтаксис: логическое выражение? выражение1: выражение2;

Результатом этого условного выражения является

expression1, если логическое выражение имеет значение true;

в противном случае результатом является выражение2.

Предположим, что вы хотите присвоить большее количество переменных num1 и num2 максимальному значению. Вы можете просто написать оператор, используя условное выражение: max = (num1> num2)? число1: число2;

Примечание: символы? и: появляются вместе в условном выражении. Они образуют условный оператор и также называются троичным оператором, потому что он использует три операнда. Это единственный троичный оператор в Java.

цитируется из: Введение в программирование на Java, 10-е издание, Y. Daniel Liang стр. 126 - 127