Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

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

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

в это:

someBool ? doSomething() : doSomethingElse();

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

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

Другие советы

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

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

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

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

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

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

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

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

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

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

  1. если IShere истинно, то Результат из gether count() является возвращенный
  2. в противном случае Результат из getAwayCount() является возвращенный

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

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

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

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

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

означает :

if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}
condition ? truth : false;

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

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

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

например ,:

public class Foo {
    final double    value;

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

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

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

В информатике троичный оператор (иногда неправильно называемый третичным оператором) - это оператор, который принимает три аргумента.Аргументы и результат могут быть разных типов.Многие языки программирования, использующие 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);
}

Вот и все!
Надеюсь, это было кому-то полезно!
Ваше здоровье!

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

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

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.

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

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

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

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

Это было отобран для дальнейшего рассмотрения в разделе JDK 7 "Project Coin".

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

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

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

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

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

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

Троичный Условный оператор

Так получилось, что мне действительно нравится этот оператор, но следует принимать во внимание читателя.

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

Прежде всего, есть дело Оригинального Аскера.Он только что потратил час на публикацию сообщений об этом и чтение ответов.Сколько времени потребовалось бы автору , чтобы написать каждый ?:как "если"/"тогда" на протяжении всей его жизни.Не прошло и часа, чтобы быть уверенным.

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

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

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

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

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

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

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

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

выражение1, если логическое выражение равно true;

в противном случае результатом будет expression2.

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

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

цитируется из:Введение в программирование на Java 10-е издание Y.Дэниел Лян страница 126 - 127

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top