Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GoslingJava2.doc
Скачиваний:
139
Добавлен:
23.02.2016
Размер:
2.39 Mб
Скачать

5.17. Операторы отношения и условный оператор

В Java имеется стандартный набор операторов отношения и условных операторов:

> больше

>= больше или равно

< меньше

<= меньше или равно

== равно

!= не равно

Все эти операторы возвращают логические значения. Унарный оператор ! инвертирует логическую величину, и, следовательно, !true— это то же самое, что и false. Проверка логических величин обычно производится непосредственно— если x и y относятся к логическому типу, то считается более изящным написать

if (x || !y) {

// ...

}

нежели

if (x == true || y == false) {

// ...

}

Результаты логических операций могут объединяться посредством операторов && и ||, которые означают “логическое И” и “логическое ИЛИ” соответственно. По возможности эти операторы стараются обойтись без вычисления своего второго операнда. Например:

if (w && x) { // внешнее "если"

if (y || z) { // внутреннее "если"

// ... // тело внутреннего "если"

}

}

Внутреннее “если” выполняется лишь в том случае, если оба значения (w и x) равны true. Если w равно false, то Java не станет вычислять x. Тело внутреннего “если” выполняется, если хотя бы одно из значений, y или z, равно true. Если y равно true, то Java не вычисляет z.

Это правило часто используется во многих программах на Java для обеспечения правильности или эффективности работы. Например, данный метод делает безопасным следующий фрагмент:

if (ix >>= 0 && ix << array.length && array[ix] != 0) {

// ...

}

Сначала выполняется проверка диапазона— только в том случае, если переменная x лежит в допустимых пределах, она будет использована для доступа к элементу массива array.

С логическими значениями используются только операторы равенства == и !=, поскольку вопрос о том, что больше— true или false— является бессмысленным.

Данное обстоятельство может использоваться для имитации “логического исключающего ИЛИ”. В приведенном ниже фрагменте метод sameSign будет выполняться лишь в том случае, если x и y имеют одинаковый знак (или одновременно равны нулю), в противном случае выполняется differentSign:

differentSign:

if (x << 0 == y << 0)

sameSign();

else

differentSign();

Значения с плавающей точкой подчиняются стандартному упорядочению (–1.0 меньше 0.0, которое, в свою очередь, меньше положительной бесконечности), за исключением аномального значения NaN. Все операторы отношения, которые сравнивают NaN с числом, всегда возвращают false, кроме оператора !=, который всегда возвращает true. Данное утверждение остается истинным, даже если оба операнда равны NaN. Например, значение выражения:

Double.NaN == Double.NaN

всегда равно false. Чтобы проверить, является ли некоторое значение NaN, используйте специальные средства, определяемые на уровне типа: статические методы Float.isNaN(float) и Double.isNaN(Double).

Две ссылки на объект всегда могут проверяться на равенство. Выражение ref1==ref2 равно true, если обе ссылки указывают на один и тот же объект или обе они равны null, даже если ссылки относятся к различным объявленным типам. В противном случае возвращается false.

С объектами String операторы равенства работают не так, как можно было бы ожидать. Для заданных объектов str1 и str2, относящихся к типу String, выражение str1==str2 проверяет, указывают ли эти две ссылки на один и тот же объект String. Оно не проверяет, совпадает ли содержимое этих строк. Равенство содержимого определяется методом String.equals, описанным в главе 8.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]