Java - Синтаксис, что это значит? [Дубликат]

- эта работа?

$rules = [
    'price' => 'nullable|regex:/^(\d+(,\d{1,2})?)?$/'
];
119
задан Randika Vishman 27 May 2016 в 09:44
поделиться

14 ответов

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

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 
160
ответ дан StackFlowed 26 August 2018 в 05:45
поделиться

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

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

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

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

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

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

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

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

0
ответ дан Bill K 26 August 2018 в 05:45
поделиться
1
ответ дан Bill the Lizard 26 August 2018 в 05:45
поделиться

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

например:

public class Foo {
    final double    value;

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

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

3
ответ дан Carl Manaster 26 August 2018 в 05:45
поделиться

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

2
ответ дан cletus 26 August 2018 в 05:45
поделиться

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

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.
1
ответ дан Darsy 26 August 2018 в 05:45
поделиться

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

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

0
ответ дан Gary 26 August 2018 в 05:45
поделиться
condition ? truth : false;

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

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

3
ответ дан Joe Phillips 26 August 2018 в 05:45
поделиться

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

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

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

28
ответ дан Jon Skeet 26 August 2018 в 05:45
поделиться

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

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

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

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

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

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

17
ответ дан JRL 26 August 2018 в 05:45
поделиться

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

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

0
ответ дан justinhj 26 August 2018 в 05:45
поделиться

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

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

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

3
ответ дан Randika Vishman 26 August 2018 в 05:45
поделиться

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

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

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

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

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

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

5
ответ дан RichN 26 August 2018 в 05:45
поделиться
4
ответ дан romaintaz 26 August 2018 в 05:45
поделиться
Другие вопросы по тегам:

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