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

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

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

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

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

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

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

6 Solutions collect form web for “В Java, каков булевский «порядок операций»?”

В учебниках 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

Потерянный пароль администратора для Windows Server 2003 Enterprise Server

FTP-соединение постоянно прерывается в определенный момент

Невозможно десериализовать текущий объект JSON (например, {“name”: “value”}) в тип ‘System.Collections.Generic.List`1

Сервер OpenVPN не работает так, как должен: не может получать большинство пакетов от устройства LAN до туннелированного клиента

Поиск длины целого числа в C

Дендрограмма с меткой и цветным листом

Что я должен установить JAVA_HOME на OSX

Есть ли разница между foo (void) и foo () в C ++ или C?

Свойство ‘map’ не существует в типе ‘Observable ‘

Можно ли зашифровать домашнюю папку на окнах 7?

Что такое исключение NumberFormatException и как его исправить?

Открыть почтовый клиент по умолчанию вместе с вложением

Сохранить текстовый файл UTF-8, закодированный с помощью VBA

Как работает автомастер весной?

Какие файлы Windows 10 «Сбросить этот ПК»?

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