Урок №64. Операторы условного ветвления if/else

  Юрий  | 

  |

  Обновл. 24 Янв 2022  | 

 107268

 ǀ   13 

На этом уроке мы рассмотрим операторы условного ветвления if/else, а также то, как их можно использовать.

Условные ветвления if/else

Самыми простыми условными ветвлениями в языке С++ являются стейтменты if/else. Они выглядят следующим образом:

if (выражение)
    стейтмент1

Либо так:

if (выражение)
    стейтмент1
else

    стейтмент2

выражение называется условием (или «условным выражением»). Если результатом выражения является true (любое ненулевое значение), то выполняться будет стейтмент1. Если же результатом выражения является false (0), то выполняться будет стейтмент2. Например:

Использование нескольких операций в ветвлениях if/else


Оператор if выполняет только одну операцию, если выражение является true, и также только одну операцию else, если выражение — false. Чтобы выполнить несколько операций подряд, используйте блок стейтментов:

Неявное указание блоков

Если программист не указал скобки для блока стейтментов if или else, то компилятор неявно сделает это за него. Таким образом, следующее:

if (выражение)
    стейтмент1
else

    стейтмент2

Будет выполняться как:

if (выражение)
{

    стейтмент1
}
else
{

    стейтмент2
}

По сути, это не имеет значения. Однако начинающие программисты иногда пытаются сделать что-то вроде следующего:

Программа не скомпилируется, и в итоге мы получим ошибку, что идентификатор a не определен. А произойдет это из-за того, что программа будет выполняться следующим образом:

В этом контексте становится понятным, что переменная a имеет локальную область видимости и уничтожается в конце блока, в котором выполняется её инициализация. И, когда мы дойдем до строчки с std::cout, переменная a уже перестанет существовать.

Связывание стейтментов if


Стейтменты if/else можно использовать в связке:

Вложенные ветвления if/else

Одни стейтменты if могут быть вложены в другие стейтменты if:

Обратите внимание, в программе, приведенной выше, мы можем наблюдать потенциальную ошибку двусмысленности оператора else. К какому if относится оператор else: к внешнему или к внутреннему?

Дело в том, что оператор else всегда относится к последнему незакрытому оператору if в блоке, в котором находится сам else. Т.е. в программе, приведенной выше, else относится к внутреннему if.

Чтобы избежать таких вот неоднозначностей при вложенности операторов условного ветвления, рекомендуется использовать блоки стейтментов (указывать скобки). Например, вот та же программа, приведенная выше, но уже без двусмысленности:

Теперь понятно, что оператор else относится к внутреннему оператору if. Использование скобок также позволяет явно указать привязку else к внешнему стейтменту if:



Используя блоки стейтментов, мы уточняем, к какому if следует прикреплять определенный else. Без блоков оператор else будет прикрепляться к ближайшему незакрытому оператору if.

Использование логических операторов в ветвлениях if/else


Также вы можете проверить сразу несколько условий в ветвлениях if/else, используя логические операторы:

Основные использования ветвлений if/else

Ветвления if/else активно используются для проверки ошибок. Например, чтобы вычислить квадратный корень значения, параметр, который передается в функцию для вычисления, — обязательно должен быть положительным:

Также операторы if используют для ранних возвратов — когда функция возвращает управление обратно в caller еще до завершения выполнения самой функции. В программе, приведенной ниже, если значением параметра является отрицательное число, то функция сразу же возвращает в caller символьную константу или перечислитель в качестве кода ошибки:

Ветвления if/else также обычно используют для выполнения простых математических операций. Например, рассмотрим функцию min(), которая возвращает минимальное из двух чисел:

Эта функция настолько проста, что её можно записать с помощью условного тернарного оператора:

Нулевые стейтменты

Также в C++ можно не указывать основную часть оператора if. Такие стейтменты называются нулевыми стейтментами (или «null-стейтментами»). Объявить их можно, используя точку с запятой вместо выполняемой операции. В целях улучшения читабельности кода, точка с запятой нулевого стейтмента обычно пишется с новой строки. Таким образом, мы явно указываем, что хотим использовать null-стейтмент, уменьшая вероятность не заметить его использования:

Хотя нулевые стейтменты редко используются в сочетании с оператором if, но, из-за неосторожности, это может привести к проблемам. Рассмотрим следующий фрагмент кода:

В вышеприведенном примере мы случайно указали точку с запятой в конце оператора if. Эта неосмотрительность приведет к тому, что код будет выполняться следующим образом:

Предупреждение: Всегда проверяйте, не «закрыли» ли вы случайно оператор if точкой с запятой.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (438 оценок, среднее: 4,95 из 5)
Загрузка...

Комментариев: 13

  1. Ахмадиёр:

  2. Андрей:

    А как же присвоить значение переменной по определенному условию и вывести из ветвления для дальнейшей обработки?

    1. Константин:

      Можно объявить переменную перед if, например


      int a;
      If (условие)
      a = 3;

      else
      a = 5

  3. Алексей:

    Прямо второе дыхание открылось.

    Честно говоря — не люблю перечислители. Пока что не видел большого применения.

  4. Константин:

    Юра, в стейтменте

    '\0' — что означает?

    1. Анастасия:

      Я не Юра, но попробую ответить.
      \0 — это завершающий нулевой символ, показывающий, что строка на этом заканчивается. Это обязательный последний символ для символьных массивов, дальше него массив не выводится, а без него вывод массива приведёт к ошибке.
      Например, если есть массив {'С', 'А', 'Ш', 'А', '/0', '!'}, и мы выводим его на экран, то получим только САША

      1. Константин:

        а прямой ли, обратный ли слэш — без разницы?!

  5. master114:

    Спасибо за проделанную работу.
    Ценность не только в переводе хорошего учебника (хотя это титанический труд) но и в поддержке студентов. Отвечаете на вопросы, комментируете тонкости, просматриваете ответы на задачи и так далее. Это очень важно!!!

    1. Фото аватара Юрий:

      Сам студент и понимаю, что так и должно быть. Если есть возможность — даю фидбек 🙂

  6. Человек:

    Не уточните, зачем вообще используются стейтменты null? Программа же просто проигнорирует эти две строки, разве нет?

    1. Фото аватара Юрий:

      Стейтменты null ничего не делают, но существуют из-за синтаксических причин. Наиболее часто они используются в качестве заполнителей в итерационных операциях, циклах, ветвлениях if. Например, вы хотите написать свою функцию определения длины строки:

      Стейтмент null здесь служит чисто для заполнения тела цикла for (тело должно быть обязательно). return i; поместить в тело цикла for нельзя, так как тогда мы получим просто 0.

      Еще вариант применения:

      В этом случае внутренний оператор else и стейтмент null удерживают внешний else от привязки к внутреннему if.

      Также еще может быть случай, когда вы хотите сохранить прежний код, закомментировав его, тем самым сохраняя возможность легкого восстановления, если он потребуется:

      1. Человек:

        Все, понял, спасибо большое

        1. Фото аватара Юрий:

          Пожалуйста 🙂

Добавить комментарий для Человек Отменить ответ

Ваш E-mail не будет опубликован. Обязательные поля помечены *