Подтвердить что ты не робот

В Java, каков булевский "порядок операций"?

Возьмем простой пример объекта Cat. Я хочу быть уверен, что "не null" Cat либо оранжевый, либо серый.

if(cat != null && cat.getColor() == "orange" || cat.getColor() == "grey") {
//do stuff
}

Я верю, И на первом месте, затем в OR. Я немного нечеткий, так что вот мои вопросы:

  • Может ли кто-нибудь пройти меня через это утверждение, поэтому я уверен, что получаю, что происходит?

  • Кроме того, что произойдет, если я добавлю скобки; изменяет ли порядок операций?

  • Будет ли мой порядок операций изменяться с языка на язык?

4b9b3361

Ответ 1

В учебниках Java есть список, иллюстрирующий приоритет оператора. Сначала будут выполняться операторы равенства, затем &&, затем ||. Скобки будут оцениваться раньше всего, поэтому их добавление может изменить порядок. Это обычно почти одинаково от языка к языку, но всегда рекомендуется дважды проверять.

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

Ответ 2

Логический порядок операций (на всех языках, которые я считаю):

  • круглые скобки
  • НЕ
  • И
  • ИЛИ

Итак, ваша логика выше эквивалентна:

(cat != null && cat.getColor() == "orange") || cat.getColor() == "grey"

Ответ 3

Выражение в основном идентично выражению:

if ( (cat != null && cat.getColor() == "orange") || cat.getColor() == "grey") {
  ...
}

Порядок приоритета здесь в том, что И (&&) имеет более высокий приоритет, чем OR (||).

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

if (cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) {
  ...
}

т.е. используйте методы equals() для сравнения String, а не ==, которые просто ссылаются на равенство. Ссылка равенство строк может ввести в заблуждение. Например:

String a = new String("hello");
String b = new String("hello");
System.out.println(a == b); // false

Ответ 4

Во-первых, оператор if содержит три основных выражения:

  • cat!= null
  • cat.getColor() == "оранжевый"
  • cat.getColor() == "серый"

Первое выражение просто проверяет, не является ли cat непустым. Его необходимо в противном случае, второе выражение будет выполнено и приведет к NPE(null pointer excpetion). Поэтому использование && между первым и вторым выражением. Когда вы используете &&, если первое выражение оценивается как false, второе выражение никогда не выполняется. Наконец, вы проверяете, является ли цвет кошки серым.

Наконец, обратите внимание, что ваш оператор if еще неверно, потому что если cat null, третье выражение по-прежнему выполняется, и, следовательно, вы получаете null исключение указателя.

Правильный способ сделать это:

if(cat != null && (cat.getColor() == "orange" || cat.getColor() == "grey")) { 
//do stuff 
} 

Проверьте порядок скобок.

Ответ 5

Да && определенно оценивается до ||. Но я вижу, что вы делаете cat.getColor() == "orange", что может дать вам неожиданный результат. Вместо этого вы можете захотеть:

if(cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) {
    //do stuff
}

Ответ 6

Порядок работы - это не то, что вам нужно, вам нужна логическая алгебра, это включает в себя логические функции. Maxterms/minterms, серый код, таблицы Karnaugh, диоды, транзисторы, логические ворота, мультиплексоры, битадеры, триггеры... Вы хотите реализовать логическую "логику" на компьютерах или виртуальных машинах. С "порядком операций" вы можете ссылаться на физику так же, как управлять задержками на логических выходах (OR, если) наносекундными интервалами?