Кен Арнольд Джеймс Гослинг

Вид материалаДокументы

Содержание


5.16. Операторы приращения и уменьшения
5.17. Операторы отношения и условный оператор
Подобный материал:
1   ...   29   30   31   32   33   34   35   36   ...   81

5.16. Операторы приращения и уменьшения


Операторы ++ и — применяются соответственно для приращения и уменьшения значений. Выражение i++ эквивалентно i = i + 1, если не считать того, что в первом случае i вычисляется всего один раз. Например, оператор

arr[where()]++;

всего один раз вызывает метод where и использует результат в качестве индекса массива. С другой стороны, в операторе

arr[where()] = arr[where()] + 1;

метод where будет вызываться дважды: один раз при вычислении правостороннего индекса, а во второй раз — при вычислении левостороннего индекса. Если при каждом вызове where возвращается новое значение, результат будет отличаться от приведенного выше выражения, в котором использован оператор ++.

Операторы приращения и уменьшения могут быть либо префиксными, либо постфиксными — то есть стоять либо до, либо после своего операнда. Если оператор стоит перед операндом (префикс), то операция приращения/уменьшения выполняется до возвращения результата выражения. Если же оператор стоит после (постфикс), то операция выполняется после использования результата. Пример:

class IncOrder {

public static void main(String[] args) {

int i = 16;

System.out.println(++i + " " + i++ + " " + i);

}

}

Результат работы будет выглядеть так:

17 17 18

Первое выведенное значение равно i после выполнения префиксного приращения до 17; второе значение равно i после этого приращения, но до выполнения следующего, постфиксного приращения до 18; наконец, значение i выводится после его постфиксного приращения в середине оператора вывода.

Операции приращения и уменьшения ++ и — могут применяться к переменным типа char для получения следующего или предыдущего символа в кодировке Unicode.

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.