if, else и ?:
В прошлом уроке программа отвечала на вопросы указателя: true или false. Теперь пора сворачивать по ответу. На развилке вы идёте по одной дороге, а по другой в этот раз не идёте.
Программе нужно то же самое: выполнить один кусок кода и пропустить другой. Инструкции в main выполняются по порядку, сверху вниз. Инструкция if выполняет блок кода, только если её условие истинно, а блок после else — если оно ложно:
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
}
}
}Давайте пройдём по программе:
int t = 25;— на улице 25 градусов.if (t < 0)— условие ложно, поэтому программа пропускает первый блок.else if (t < 20)— это условие тоже ложно.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 не читает: строка с отступом, но без скобок, к ветке не относится. Поэтому ветку всегда берут в фигурные скобки, даже если в ней одна строка.
Условный оператор ?:
Иногда ветки различаются только значением: погода тёплая или прохладная. Для такого выбора есть условный оператор ?:. Он не выполняет действия, а сам даёт значение:
int t = 25;
String word = t < 20 ? "cool" : "warm";
System.out.println(word); // warmЗапись t < 20 ? "cool" : "warm" состоит из трёх частей:
- условие
t < 20; - после
?— значение на случай, когда условие истинно:"cool"; - после
:— значение на случай, когда условие ложно:"warm".
Условие ложно, поэтому в word попадает "warm". У оператора три части, и его ещё называют тернарным. Оба значения должны подходить переменной: здесь это строки. Когда вариантов три и больше, берите if и else if, а не цепочку из нескольких ?:.
Частая ошибка
Вторую строку ветки написали с отступом, но без фигурных скобок:
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, когда ложно.