Кен Арнольд Джеймс Гослинг
Вид материала | Документы |
Содержание5.16. Операторы приращения и уменьшения 5.17. Операторы отношения и условный оператор |
- Джеймс трефил, 41001.36kb.
- Джеймс А. Дискретная математика и комбинаторика [Текст] / Джеймс А. Андерсон, 42.79kb.
- Человеческая способность эти ценности производить и использовать; является важнейшей, 110.76kb.
- Джеймс блиш города в полете 1-4 триумф времени вернись домой, землянин жизнь ради звезд, 10495.38kb.
- Джеймс Н. Фрей. Как написать гениальный роман, 2872.12kb.
- Дп «авто интернешнл» Київ, вул. Урицького, 1а Тел. (044) 20-60-333 Факс. (044) 20-60-343, 82.44kb.
- Тема Кол-во страниц, 26.85kb.
- Тема Кол-во страниц, 56.3kb.
- Тема Кол-во страниц, 20.7kb.
- Арнольд И. В. Стилистика современного английского языка, 20.42kb.
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.