Операторы быстрой оценки логических выражений (short circuit logical operators)
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Существуют два интересных дополнения к набору логических операторов. Это альтернативные версии операторов AND и OR, служащие для быстрой оценки логических выражений. Вы знаете, что если первый операнд оператора OR имеет значение true, то независимо от значения второго операнда результатом операции будет величина true. Аналогично, в случае оператора AND, если первый операнд - false, то значение второго операнда на результат не влияет - он всегда будет равен false. Если вы используете операторы && и || вместо обычных форм & и |, то Java не производит оценку правого операнда логического выражения, если ответ ясен из значения левого операнда. Общепринятой практикой является использование операторов && и || практически во всех случаях оценки булевых логических выражений. Версии этих операторов & и | применяются только в битовой арифметике.

Оператор instanceof

Оператор instanceof проверяет, принадлежит ли объект некоторому типу. В левой части выражения instanceof указывается ссылка, а в правой – имя класса или интерфейса. Оператор instanceof возвращает true, если выражение левой части совместимо с типом, название которого указано в правой части, и false – в противном случае.

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

Тернарный оператор if-then-else

Общая форма оператора if-then-else такова:

выражение1? выражение2: выражениеЗ

В качестве первого операнда - <выражение1> - может быть использовано любое выражение, результатом которого является значение типа boolean. Если результат равен true, то выполняется оператор, заданный вторым операндом, то есть, <выражение2>. Если же первый операнд paвен false, то выполняется третий операнд - <выражениеЗ>. Второй и третий операнды, то есть <выражение2> и <выражениеЗ>, должны возвращать значения совместимых типов и не должны иметь тип void.

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

class Ternary {

public static void main ( String [] args ) {

       int a = 42;

       int b = 2;

       int c = 99;

       int d = 0;

       int e = (b == 0) ? 0 : (a / b);

       int f = (d == 0) ? 0 : (c / d);

       System.out.println("a = " + a);

       System.out.println("b = " + b);

       System.out.println("c = " + c);

       System.out.println("d = " + d);

       System.out.println("a / b = " + e);

       System.out.println("c / d = " + f);

}

}

При выполнении этой программы исключительной ситуации деления на нуль не возникает и выводятся следующие результаты:

а = 42

b = 2

с = 99

d = 0

a / b = 21

с / d = 0

Приоритеты операторов

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

Таблица 15 - Приоритеты операторов

Постфиксные операторы [] . (params) expr++ expr--              
Унарные операторы ++expr --expr +expr -expr ~ !            
Операторы создания объектов и преобразования типов new (type)expr                    
Операторы умножения, деления и вычисления остатка * / %                  
Операторы сложения и вычитания + -                    
Операторы побитового сдвига << >> >>>                  
Операторы сравнения < > >= <= instanceof              
Операторы равенства и неравенства == !=                    
И (AND) &                      
Исключающее ИЛИ (XOR) ^                      
Включающее ИЛИ (OR) |                      
Условное И (AND) &&                      
Условное ИЛИ (OR) ||                      
Условный оператор ?:                      
Операторы присваивания = += -= *= /= %= >>= <<= >>>= &= ^= |=

В первой строке таблицы приведены три оператора, о которых мы пока не говорили. Круглые скобки () используются для явной установки приоритета. Квадратные скобки [] используются для индексирования переменной-массива. Оператор . (точка) используется для выделения элементов из ссылки на объект. Все же остальные операторы уже обсуждались ранее.

Явные приоритеты

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

а >> b + 3

Какому из двух выражений, а >> (b + 3) или (а >> b) + 3, соответствует первая строка? Поскольку у оператора сложения более высокий приоритет, чем у оператора сдвига, правильный ответ - а>> (b + а). Так что если вам требуется выполнить операцию (а>>b)+ 3 без скобок не обойтись.

Дата: 2019-02-19, просмотров: 228.