Является ли написание оператора else последним обязательным в лестнице if-else в C++?

Я всегда видел, что в конце лестницы 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();
}

Я знаю, что приведенный ниже код также выполняется успешно. Но я просто хотел подтвердить это, задав этот вопрос на форуме.

Предложение else не является обязательным.

Some programmer dude 18.04.2024 16:41

Да, это законно. В общем, лестница if-else-if не является особым случаем, это просто набор if else, в котором фигурные скобки после else опущены. Это будет легче увидеть, если вы сделаете отступ в коде следующим образом: gcc.godbolt.org/z/hb8jddv9v

HolyBlackCat 18.04.2024 16:42

@Someprogrammerdude Так что написание кода без последнего «else» также допустимо. Верно ?

Divyanshu Dwivedi 18.04.2024 16:44

@DivyanhuDwivedi Оба фрагмента действительны, но выполняют разные действия. Меня смущает ваш вопрос, поскольку вы ясно понимаете, что noConditionsMet() не будет вызываться во втором фрагменте.

Ted Lyngmo 18.04.2024 16:54

В C++23 есть std::unreachable. Если обязательно, чтобы последняя ветка else никогда не использовалась, вы можете использовать ее вместо noConditionMet(). В отладочных сборках он часто ведет себя как assert(false), а в релизных сборках это сигнал оптимизатору воспользоваться преимуществом (если это возможно).

tbxfreeware 18.04.2024 17:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
5
162
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Нет! Предложение else совершенно необязательно!

вы имеете в виду «еще», написанное последним в else-if, лестница не является обязательной? Верно ?

Divyanshu Dwivedi 18.04.2024 16:45

Как вы и сказали, последнее else заявление не требуется. Но я обычно включаю его для выявления и обработки случаев, когда ни одно из предыдущих условий не выполняется. Например, если есть condition4, ваш код будет возвращаться в прошлое и может содержать ошибки, из-за которых вам придется рвать на себе волосы в будущем. 😉 Имеет ли это смысл в контексте, в котором вы его используете, решать вам.

Ответ принят как подходящий

Это необязательно, а «лестница» — иллюзия.

Синтаксис условного оператора:

if (condition) 
    statement 
else 
    statement

где ветка else необязательна.
Не имеет значения, является ли ветвь else другим условием.

Обратите внимание, что ваша «лестница» эквивалентна

if (condition1) {
  doA();
} else {
    if (condition2) {
      doB();
    } else {
        if (condition3) {
            doC();
        } else {
            noConditionsMet();
        }
    }
}

что проясняет, что это не «лестница», а просто вложенные операторы.
Просто вы можете не использовать «блочные скобки», когда ветвь состоит из одного оператора.

Значит, я могу пропустить последнее предложение «else»? Я прав ? Да ?

Divyanshu Dwivedi 19.04.2024 08:21

Вот что значит «необязательно», да.

molbdnilo 19.04.2024 09:05

Другие вопросы по теме