Я всегда видел, что в конце лестницы if-else в C++ всегда присутствует нижний оператор else.
if (condition1) {
doA();
} else if (condition2) {
doB();
} else if (condition3) {
doC();
} else {
noConditionsMet();
}
Необходимо ли это делать с точки зрения синтаксиса? Или я также могу написать код, как показано ниже, то есть без использования последнего оператора else?
if (condition1) {
doA();
} else if (condition2) {
doB();
} else if (condition3) {
doC();
}
Я знаю, что приведенный ниже код также выполняется успешно. Но я просто хотел подтвердить это, задав этот вопрос на форуме.
Да, это законно. В общем, лестница if-else-if не является особым случаем, это просто набор if else
, в котором фигурные скобки после else
опущены. Это будет легче увидеть, если вы сделаете отступ в коде следующим образом: gcc.godbolt.org/z/hb8jddv9v
@Someprogrammerdude Так что написание кода без последнего «else» также допустимо. Верно ?
@DivyanhuDwivedi Оба фрагмента действительны, но выполняют разные действия. Меня смущает ваш вопрос, поскольку вы ясно понимаете, что noConditionsMet()
не будет вызываться во втором фрагменте.
В C++23 есть std::unreachable
. Если обязательно, чтобы последняя ветка else никогда не использовалась, вы можете использовать ее вместо noConditionMet()
. В отладочных сборках он часто ведет себя как assert(false)
, а в релизных сборках это сигнал оптимизатору воспользоваться преимуществом (если это возможно).
Нет! Предложение else совершенно необязательно!
вы имеете в виду «еще», написанное последним в else-if, лестница не является обязательной? Верно ?
Как вы и сказали, последнее else
заявление не требуется. Но я обычно включаю его для выявления и обработки случаев, когда ни одно из предыдущих условий не выполняется.
Например, если есть condition4
, ваш код будет возвращаться в прошлое и может содержать ошибки, из-за которых вам придется рвать на себе волосы в будущем. 😉 Имеет ли это смысл в контексте, в котором вы его используете, решать вам.
Это необязательно, а «лестница» — иллюзия.
Синтаксис условного оператора:
if (condition)
statement
else
statement
где ветка else
необязательна.
Не имеет значения, является ли ветвь else
другим условием.
Обратите внимание, что ваша «лестница» эквивалентна
if (condition1) {
doA();
} else {
if (condition2) {
doB();
} else {
if (condition3) {
doC();
} else {
noConditionsMet();
}
}
}
что проясняет, что это не «лестница», а просто вложенные операторы.
Просто вы можете не использовать «блочные скобки», когда ветвь состоит из одного оператора.
Значит, я могу пропустить последнее предложение «else»? Я прав ? Да ?
Вот что значит «необязательно», да.
Предложение
else
не является обязательным.