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

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

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

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

  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") { ... } 

Порядок приоритета здесь в том, что И ( && ) имеет более высокий приоритет, чем 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 

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

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

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

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

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

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

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

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

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

Порядок работы – это не то, что вам нужно, вам нужна логическая алгебра, это включает в себя логические функции. Maxterms / minterms, Grey code, таблицы Karnaugh, диоды, транзисторы, логические ворота, мультиплексоры, битадеры, триггеры … Что вы хотите реализовать логическую логику на компьютерах или виртуальных машинах. С «порядком операций» вы можете ссылаться на физику так же, как управлять задержками на логических выходах (ИЛИ, если) наносекундными интервалами?

Interesting Posts

Угловой 2 Используйте компонент из другого модуля

Недопустимый селектор CSS заставляет исключить правило: что такое обоснование?

Есть ли способ изменить расстояние между элементами легенды в ggplot2?

Один монитор работает точно так же, как двойной монитор?

Структурный конструктор в C ++?

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

Android – SPAN_EXCLUSIVE_EXCLUSIVE охватывает не может иметь нулевую длину

Как мы можем восстановить (не возвращать) пароль маршрутизатора?

Как проверить, существует ли строка в файле с Bash?

Как автоматически регистрировать class при создании

Как сортировать буквы в строке?

В чем разница между 64-битными и 32-разрядными операционными системами?

Как удалить расширения pice0chop из Google Chrome?

Как определить, попал ли пользователь на страницу с помощью кнопки «Назад»?

измените оба названия легенды в ggplot с двумя легендами

Давайте будем гением компьютера.