Как называется оператор Java?: И что он делает?

ОБНОВЛЕНО (Извините за мои ошибки в командной строке)

Лучше используйте эту команду:

g++ `pkg-config --cflags --libs opencv` opencv.cpp -o opencv

Команда pkg-config найдет правильное включение и библиотеку для вашего исходный код. Для лучшей обработки с помощью программирования OpenCV используйте IDE, например code::block.

Возможно, этот учебник поможет вам в программировании OpenCV с помощью code::block: Как установить OpenCV для кода :: block в Linux и Windows?

140
задан Randika Vishman 27 May 2016 в 09:44
поделиться

12 ответов

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

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

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

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

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

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

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

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

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

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

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

в это:

someBool ? doSomething() : doSomethingElse();

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

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 
182
ответ дан 23 November 2019 в 22:31
поделиться

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

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

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

31
ответ дан 23 November 2019 в 22:31
поделиться

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

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

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

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

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

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

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

) Но, честно говоря, не обязательно более читабельно для 90% людей просто из-за его редкости.

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

) Но, честно говоря, не обязательно более читабельно для 90% людей просто из-за его редкости.

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

0
ответ дан 23 November 2019 в 22:31
поделиться

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

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

0
ответ дан 23 November 2019 в 22:31
поделиться

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

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

0
ответ дан 23 November 2019 в 22:31
поделиться

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

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

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

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

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

1
ответ дан 23 November 2019 в 22:31
поделиться

Исправить. Его называют троичным оператором .

2
ответ дан 23 November 2019 в 22:31
поделиться

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

Например:

public class Foo {
    final double    value;

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

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

3
ответ дан 23 November 2019 в 22:31
поделиться
condition ? truth : false;

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

Он называется условным оператором и является типом троичной операции .

4
ответ дан 23 November 2019 в 22:31
поделиться
int count = isHere ? getHereCount(index) : getAwayCount(index);

означает:

if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}
4
ответ дан 23 November 2019 в 22:31
поделиться

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

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

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

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

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

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

5
ответ дан 23 November 2019 в 22:31
поделиться

В соответствии с спецификацией 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, иначе произойдет ошибка времени компиляции.

17
ответ дан 23 November 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: