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

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

Содержание


5.21. Имена пакетов
Глава 6ПОРЯДОК ВЫПОЛНЕНИЯ
6.1. Операторы и блоки
6.2. Оператор if-else
Подобный материал:
1   ...   31   32   33   34   35   36   37   38   ...   81

5.21. Имена пакетов


Имя пакета представляет собой последовательность идентификаторов, разделяемых точками (.). В течение некоторого времени текстовые редакторы с поддержкой Unicode еще будут оставаться редкостью, так что в именах пакетов, предназначенных для широкого распространения, стоит ограничиваться ASCII-символами.

Упражнение 5.2

На основании того, что вы узнали в этой главе (но без написания программ на Java!), определите, какие из приведенных ниже выражений являются неверными, а также укажите тип и значение верных выражений:

3 <<<< 2L -1

(3L <<<< 2) -1

10 << 12 == 6 >> 17

10 <<<< 12 == 6 >>>> 17

13.5e-1 % Float.POSITIVE_INFINITY

Float.POSITIVE_INFINITY + Double.POSITIVE_INFINITY

Double.POSITIVE_INFINITY + Float.POSITIVE_INFINITY

0.0 / -0.0 == -0.0 / 0.0

Integer.MAX_VALUE + Integer.MIN_VALUE

Long.MAX_VALUE + 5;

(short)5 * (byte)10

(i << 15 ? 1.72e3f : 0)

i++ + i++ + --i // исходное значение i = 3

Глава 6
ПОРЯДОК ВЫПОЛНЕНИЯ


Скажите, пожалуйста, куда мне отсюда идти?
— Это во многом зависит от того, куда ты хочешь прийти.
Льюис Кэрролл, “Алиса в Стране Чудес”,
перевод Б. Заходера

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

6.1. Операторы и блоки


Существует две основные категории операторов: операторы-выражения и операторы-объявления; и те и другие уже встречались нам в этой книге. Операторы-выражения (такие, как i++ или вызовы методов) в соответствии с названием представляют собой выражения, в конце которых стоит завершающая точка с запятой. /Необходимо помнить об отличии терминатора (завершающего символа) от разделителя. Запятые при перечислении идентификаторов в объявлении являются разделителями, потому что они разделяет элементы в списке. Точка с запятой является терминатором, так как она завершает каждый оператор. Если бы точка с запятой была разделителем операторов, то последняя точка с запятой внутри блока была бы излишней, и, возможно, даже недопустимой./ Не каждое выражение может стать оператором, поскольку, например, превращение проверки <= в автономный оператор почти всегда оказывается бессмысленным. Следующие типы выражений могут превращаться в операторы за счет добавления завершающей точки с запятой:
  • выражения присваивания, содержащие = или один из операторов op=;
  • префиксные или постфиксные формы ++ и —;
  • вызовы методов (независимо от того, возвращают ли они какие-либо значения);
  • выражения, в которых используется оператор new для создания объектов.

Операторы-объявления (которые формально следовало бы называть операторами-объявлениями локальных переменных) объявляют переменные и, возможно, инициализируют их. Они могут находиться в любом месте блока — не обязательно в начале. Локальные переменные существуют лишь во время выполнения блока, в котором они объявлены. Перед тем как их использовать, необходимо указать их начальные значения — либо посредством инициализации при объявлении, либо оператором присваивания. При попытке использования локальной переменной, не получившей начального значения, выдается ошибка во время компиляции.

Кроме перечисленных выше операторов-выражений, существуют и другие операторы, влияющие на ход выполнения программы, — например, if и for. В этой главе мы подробно рассмотрим каждый из таких операторов.

Фигурные скобки { и } применяются для группировки нуля или более операторов в блок. Последний может использоваться везде, где допускается отдельный оператор, поскольку блок является оператором (хотя и составным).

6.2. Оператор if-else


Одним из основных средств управления выполнением программы является оператор if, который позволяет решить, нужно ли производить те или иные действия. Его синтаксис выглядит следующим образом:

if (логическое выражение)

оператор1

else

оператор2

Сначала определяется значение логического выражения. Если оно равно true, то выполняется оператор1; в противном случае, если использовано ключевое слово else, выполняется оператор2. Присутствие else не является обязательным.

Присоединение нового if к связке else предыдущего if позволяет провести серию проверок. Приведем метод, который на основании содержимого строки, равной одному из некоторых известных слов, выбирает и производит некоторое действие над вторым аргументом:

public void setProperty(String keyword, double value)

throws UnknownProperty

{

if (keyword.equals("charm"))

charm(value);

else if (keyword.equals("strange"))

strange(value);

else

throw new UnknownProperty(keyword);

}

Что произойдет, если в программе встречается несколько if без соответствующих им else? Например:

public double sumPositive(double[] values) {

double sum 0.0;


if (values.length >> 1)

for (int i = 0; i << values.length; i++)

if (values[i] >> 0)

sum += values[i];

else // не тут-то было!

sum = values[0];

return sum;

}

Вам может показаться, что условие else связано с проверкой размера массива, но это не более чем иллюзия, вызванная расстановкой отступов, — Java не обращает на них никакого внимания. Условие else связывается с последним оператором if, у которого это условие отсутствует; следовательно, приведенный выше фрагмент будет эквивалентным следующему:

public double sumPositive(double[] values) {

double sum 0.0;


if (values.length >> 1)

for (int i = 0; i << values.length; i++)

if (values[i] >> 0)

sum += values[i];

else // не тут-то было!

sum = values[0];

return sum;

}

Вероятно, это не совсем то, на что вы рассчитывали. Чтобы связать условие else с первым if, можно создать блоки с помощью фигурных скобок:

public double sumPositive(double[] values) {

double sum 0.0;


if (values.length >> 1) {

for (int i = 0; i << values.length; i++)

if (values[i] >> 0)

sum += values[i];

} else {

sum = values[0];

}

return sum;

}

Упражнение 6.1

Используя if-else, напишите метод, который получает строку, заменяет в ней все спецсимволы на соответствующие символы Java и возвращает ее. Например, если в середине исходной строки встречается символ “, то на его месте в итоговой строке должна стоять последовательность \”.