Вложенные операторы if
Введено| English | Значение |
|---|---|
| nested if/ˈnestɪd ɪf/ | Вложенный if |
Широкая первая ветвь скрывает высшую оценку
- Лестница оценок проверяет
s >= 60доelse if (s >= 90). При s=95 первое условие истинно, поэтому выполняется её ветвь, и ветвь для высшей оценки никогда не тестируется. - Для этих перекрывающихся нижних пределов сначала проверяйте более высокий порог. Это правило рассуждения для данной лестницы, а не требование сортировать все возможные условия от «наиболее специфичного» к «наименее специфичному».
Вложенность делает решение зависимым от окружающего пути
- Вложенный if размещает if внутри другой ветви. Если внутреннее утверждение находится во внешней истинной ветви, оно достигается только тогда, когда истинно внешнее условие; if внутри else достигается по ложному пути.
- Используйте фигурные скобки для отображения этой структуры. else без фигурных скобок связывается с ближайшим несоответствующим if, что может отличаться от того, что предполагает отступ.
Лестница выбирает первое совпадающее условие
- Лестница
if ... else if ... elseпроверяет условия сверху вниз до первого истинного. С финальным else выбирается одна ветвь после завершения оценки условий; без else ни одна может не выполниться. - Приведённый ниже метод принимает обычные целочисленные баллы и возвращает оценки A, B, C или F. Для 85 он проверяет условие 90, затем 80, возвращает оценку B и больше не выполняет проверку оставшихся условий.
public class GradeChoice {
public static String grade(int s) {
if (s >= 90) {
return "A";
} else if (s >= 80) {
return "B";
} else if (s >= 70) {
return "C";
} else {
return "F";
}
}
}
Различайте перекрывающиеся и непересекающиеся случаи
- При перекрывающихся нижних пределах
s >= 60включает каждый балл, удовлетворяющийs >= 90. Размещение его первым предотвращает выбор второй ветви, хотя Java может скомпилировать лестницу. - Для чистых независимых проверок, таких как
x < 0,x == 0иx > 0, изменение их порядка при сохранении тех же результатов не обязательно приведёт к изменению итогового ответа. Однако при наличии пересекающихся политик может потребоваться явное приоритирование одного случая; следуйте указанным требованиям.
Первая истинная ветвь побеждает
s = 85 проходит по ветке >= 80 (B); последующие ветви пропускаются.
В цепочке else-if какой блок условия выполняется?
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Java обрабатывает первое истинное условие сверху вниз.
Для if (s>=90) A; else if (s>=80) B; else C; при s = 85 результатом будет...
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
85 не проходит >=90, но проходит >=80 → B, затем остановка.
Если широкое условие стоит перед узким в цепочке, узкая ветвь может стать недостижимой.
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Широкое условие перехватывает эти случаи первыми; ставьте более точные условия первыми.
Для внутреннего if, расположенного внутри истинной ветки внешнего if, внутреннее условие проверяется даже тогда, когда внешнее условие ложно.
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Это внутреннее утверждение не достигается на ложном пути. Если бы if был размещен внутри ветки else, он имел бы другой охватывающий путь.
Для показанной шкалы оценок с использованием условий s >= 90, s >= 80 и s >= 70, какое расположение сохраняет intended top grades (высшие оценки)?
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Более высокие нижние границы идут первыми, потому что эти сравнения перекрываются. Это не универсальное правило для всех булевых условий.
Отделяйте независимые if от лестницы
- Два отдельных оператора,
if (s >= 60) ...; if (s >= 90) ...;, оба выполнят своё тело при s=95. Цепочка if-else связывает альтернативы и выбирает только первое совпадение. - Проследите выполнение с фактическими значениями на пороге и непосредственно под ним: 90 даёт A, 89 — B, 80 — B, 79 — C, а 69 — F. Проверка только значения 85 могла бы пропустить ошибку в операторе сравнения границы.
"Первое истинное побеждает" описывает связанную лестницу, а не несколько независимых if-утверждений. Ветвь может быть невозможной для выбора, потому что предыдущая проверка ловит все её входные данные без вызова ошибки компиляции "недостижимый код".
Два независимых if-оператора проверяют s >= 60 и s >= 90. Для s=95, сколько тел операторов выполнится?
Сложность 2/5 · 140 монет + небольшой бонус за первое выполнение сегодня
Оба условия истинны, а операторы независимы, поэтому выполняются оба тела.
Отслеживайте ложную ветвь внешнего if
- В конструкции
if (weekday) { ... } else { if (raining) { ... } }внутренняя проверка дождя достигается, когда день недели равен false. Именно охватывающий блок, а не само слово «вложенный», определяет момент выполнения этого кода. - Определите скобки, связанные альтернативы, перекрывающиеся условия и фактический входной параметр перед прогнозированием пути. Сохраняйте политику кода и граничные тесты согласованными; отступы сами по себе не определяют группировку в Java.
Вложенный if выполняется только тогда, когда управление достигает его охватывающего ветвления. Связанная лестница выбирает первое истинное условие; независимые операторы if могут выполнить несколько тел. Более высокие пороги стоят первыми в этой конкретной оценке лестницы, потому что их условия перекрываются.
With if (s >= 60) result = 1; else if (s >= 90) result = 2; else result = 3;, what is result for s = 95?
Сложность 2/5 · 140 монет + небольшой бонус за первое выполнение сегодня
95 satisfies the first comparison, so result becomes 1 and the else-if branch is skipped.
if, расположенный внутри ветки else внешнего if, может быть достигнут, когда внешнее условие ложно.
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Да: ложная ветка внешнего if переходит в блок else, где может выполниться внутренняя проверка.