Перейти к содержимому
Теория · Условия · урок 3 из 8

if, else и ?:

В прошлом уроке программа отвечала на вопросы указателя: true или false. Теперь пора сворачивать по ответу. На развилке вы идёте по одной дороге, а по другой в этот раз не идёте.

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

JAVA
public class Main {
    public static void main(String[] args) {
        int t = 25;
        if (t < 0) {
            System.out.println("frost");
        } else if (t < 20) {
            System.out.println("cool");
        } else {
            System.out.println("warm"); // warm
        }
    }
}

Давайте пройдём по программе:

  1. int t = 25; — на улице 25 градусов.
  2. if (t < 0) — условие ложно, поэтому программа пропускает первый блок.
  3. else if (t < 20) — это условие тоже ложно.
  4. else — остаётся последний блок, и программа печатает warm.

Три вида веток

Блок в фигурных скобках, который выполняется при своём условии, называют веткой. В примере их три, и у каждой своя роль.

if

Ветка if открывает развилку. Её заголовок состоит из трёх частей:

  • ключевое слово if;
  • условие в круглых скобках, например (t < 0);
  • блок в фигурных скобках, который выполняется, когда условие истинно.

Круглые скобки вокруг условия обязательны: без них компилятор ответит '(' expected. Само условие имеет тип boolean, поэтому запись if (t) с числом t не компилируется. if может стоять и один, без else: тогда при ложном условии не выполнится ничего.

else if

Ветка else if добавляет к развилке ещё одно условие. Его проверяют, только если все условия выше оказались ложны.

Цепочка проверяется сверху вниз. Выполняется первая ветка с истинным условием, а остальные пропускаются. Поэтому во второй ветке хватает условия t < 20: что t не меньше нуля, уже известно.

Здесь развилка отличается от Java. Путник может оглядеть все указатели и выбрать самый подходящий. Java читает их строго сверху вниз и сворачивает на первом, чей ответ — true.

else

У ветки else нет условия. Она выполняется, когда ложны все условия выше, и всегда стоит последней. Без неё в этом случае не выполнится ничего.

Фигурные скобки

Фигурные скобки собирают несколько инструкций в одну ветку. Без скобок ветке принадлежит только одна инструкция — первая после условия. Отступы Java не читает: строка с отступом, но без скобок, к ветке не относится. Поэтому ветку всегда берут в фигурные скобки, даже если в ней одна строка.

Условный оператор ?:

Иногда ветки различаются только значением: погода тёплая или прохладная. Для такого выбора есть условный оператор ?:. Он не выполняет действия, а сам даёт значение:

JAVA
int t = 25;
String word = t < 20 ? "cool" : "warm";
System.out.println(word); // warm

Запись t < 20 ? "cool" : "warm" состоит из трёх частей:

  1. условие t < 20;
  2. после ? — значение на случай, когда условие истинно: "cool";
  3. после : — значение на случай, когда условие ложно: "warm".

Условие ложно, поэтому в word попадает "warm". У оператора три части, и его ещё называют тернарным. Оба значения должны подходить переменной: здесь это строки. Когда вариантов три и больше, берите if и else if, а не цепочку из нескольких ?:.

Частая ошибка

Вторую строку ветки написали с отступом, но без фигурных скобок:

JAVA
int balance = 500;
if (balance < 100)
    System.out.println("low balance");
    System.out.println("top up your card"); // ✗

Программа печатает top up your card, хотя денег достаточно. Отступ обманывает: ветке if принадлежит только первая инструкция. Вторая стоит вне if и выполняется всегда. Возьмите обе строки в фигурные скобки, и при балансе 500 не напечатается ничего. Эту ловушку часто показывают на собеседованиях.

Главное

  • if выполняет ветку, когда условие истинно, а else — когда ложны все условия выше.
  • Цепочка else if выполняет первую ветку с истинным условием и пропускает остальные.
  • Без фигурных скобок ветке принадлежит одна инструкция, поэтому скобки ставят всегда.
  • ok ? a : b даёт a, когда условие ok истинно, и b, когда ложно.