Оператор if

Оператор if — оператор условного выбора ветви Java-программы. Его можно использовать для направления выполнения программы по двум различным ветвям. Общая форма этого оператора выглядит следующим образом:

if (условие) оператор1;
else оператор2;

Здесь каждый оператор — это одиночный оператор или составной оператор, заключенный в фигурные скобки (т.е. блок). Условие — это любое выражение, возвращающее значение типа boolean. Выражение else не обязательно.

Оператор if работает следующим образом: если условие истинно, программа выполняет оператор1. В противном случае она выполняет оператор2 (если он существует). Ни в одной из ситуаций программа не будет выполнять оба оператора.

Например, рассмотрим следующий фрагмент кода:

int а, b;
if (а < b) а = 0;
else b = 0;

В данном случае, если значение а меньше значения b, значение переменной а устанавливается равным нулю. В противном случае значение переменной b устанавливается равным нулю. Ни в одной из ситуаций значения обеих переменных а и b не могут получить нулевые значения.

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

boolean dataAvailable;
// ...
if (dataAvailable)
ProcessData() ;
else
waitForMoreData() ;

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

int bytesAvailable;
// ...
if (bytesAvailable > 0) {
ProcessData();
bytesAvailable -= n;
} else
waitForMoreData();

В этом примере оба оператора, помещенные внутрь блока, будут выполняться, если значение переменной bytesAvailable больше нуля.

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

int bytesAvailable;
// ...
if (bytesAvailable > 0) {
ProcessData();
bytesAvailable -= n;
} else
waitForMoreData();
bytesAvailable = n;

Если судить по уровню отступа в коде, предполагалось, что оператор by tesAvailable=n ; должен выполняться внутри выражения else. Однако, как вы помните, в Java-программе пробелы значения не имеют, и компилятор никак не может "узнать" намерения программ миста. Компиляция этого кода будет выполняться без вывода каких-либо предупреждающих сообщений, но при выполнении программа будет вести себя не так, как было задумано. В следующем фрагменте ошибка предыдущего примера исправлена:

int bytesAvailable;
// ...
if (bytesAvailable > 0) {
ProcessData();
bytesAvailable -= n;
} else {
waitForMoreData();
bytesAvailable = n;
}

Вложенные операторы if

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

if(i == 10) {
if (j < 20) a = b;
if(k > 100) с = d; // этот оператор if
else a = с; // связан с этим оператором else
}
else a = d; // этот оператор else связан с оператором if(i == 10)

Как видно из комментариев, последний оператор else связан не с оператором if (j<20), поскольку тот не находится в одном с ним блоке (несмотря на то, что он является ближайшим оператором if, который еще не связан с оператором else). Последний оператор else связан с оператором if (i==10). Внутренний оператор else связан с оператором if (k>100), поскольку тот является ближайшим внутри этого же блока.

Многозвенная структура if-else-if

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

if (условие)
оператор; else if(условие)
оператор; else if(условие)
оператор;
else оператор;

Операторы if выполняются последовательно, сверху вниз. Как только одно из условий, управляющих оператором if, становится равным true, программа выполняет оператор, связанный с данным оператором if, и пропускает остальную часть многозвенной структуры. Если ни одно из условий не выполняется (не равно true), программа выполнит заключительный оператор else. Этот последний оператор служит условием, используемым по умолчанию. То есть если проверка всех остальных условий дает отрицательный результат, программа выполняет последний оператор else. Если заключительный оператор else не указан, а результат проверки всех остальных условий равен false, программа не будет выполнять никаких действий.

Ниже приведен пример программы, в которой многозвенная структура if-else-if служит для определения времени года, к которому относится конкретный месяц.

// Демонстрация применения операторов if-else-if.
class IfElse {
public static void main(String argsf]) {
int month = 4; // Апрель
String season;
if (month == 12 || month == 1 || month == 2)
season = "зиме"; else if (month == 3 || month == 4 || month == 5)
season = "весне"; else if (month == 6 || month == 7 || month == 8)
season = "лету"; else if(month == 9 || month ==10 || month == 11)
season = "осени";
else season = "вымышленным месяцам";
System.out.println("Апрель относится к " + season + ".");
}
}

Программа создает следующий вывод:

Апрель относится к весне

Прежде чем продолжить прочтение главы, можете поэкспериментировать с этой программой. Вы убедитесь, что независимо от значения, присвоенного переменной month, внутри многозвенной структуры будет выполняться только один оператор присваивания.