Вопрос

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

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

Я верю, и на первом месте стоит "ИЛИ", затем "ИЛИ".Хотя я немного расплывчатый, так что вот мои вопросы:

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

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

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

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

Решение

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

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

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

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

  1. скобки
  2. НЕ
  3. И
  4. или

Таким образом, ваша логика выше эквивалентна:

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

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

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

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

Вы также должны знать, что использование == для проверки на равенство строк будет иногда работайте на 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

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

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

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

  1. кошка != null
  2. cat.getColor() == "оранжевый"
  3. cat.getColor() == "серый"

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

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

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

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

Проверьте порядок расположения круглых скобок.

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

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