Существуют два интересных дополнения к набору логических операторов. Это альтернативные версии операторов 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, просмотров: 274.