Конструкция if-else и тернарный оператор

Последнее обновление: 20.02.2023

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

if (условие)
{
	инструкции;
}

В качестве условия использоваться условное выражение, которое возвращает true или false. Если условие возвращает true, то выполняются последующие инструкции, которые входят в блок if. Если условие возвращает false, то последующие инструкции не выполняются. Блок инструкций заключается в фигурные скобки. Например:

#include <iostream>

int main()
{
    int a {8};
    if(a == 8)
    {
        std::cout << "a == 8" << std::endl;
    }
    std::cout << "End of program" <<  std::endl;
}

Здесь условие конструкции if представляет выражение a == 8, то есть мы сравниваем, равно ли значение переменной a числу 8. И это условие верно и возвращает true. Соответственно будет выполняться единственная инструкция из блока if, которая выведет на консоль строку "a == 8". А консольный вывод будет следующим:

a == 8
End of program

После конструкции if могут идти остальные инструкции программы, которые выполняются вне зависимости от условия. Так, в примере выше после блока if идет инструкция, которая выводит на консоль строку "End of program".

Теперь посмотрим на противоположную ситуацию:

#include <iostream>

int main()
{
    int a {8};
    if(a == 7)
    {
        std::cout << "a  == 7" << std::endl;
    }
    std::cout << "End of program" <<  std::endl;
}

Здесь уже другое условие: a == 7, то есть мы сравниваем, равно ли значение переменной a числу 7. Но переменная a НЕ равна 7, поэтому условие неверно и возвращает false. Соответственно инструкции в блоке if НЕ выполняются. А консольный вывод будет следующим:

End of program

Стоит отметить, что если блок инструкций состоит из одной инструкции, то мы можем не использовать фигурные скобки:

#include <iostream> 

int main()
{
    int a {8};
    if(a == 8)  // только одна инструкция
        std::cout << "a == 8" << std::endl;

    std::cout << "End of program" <<  std::endl;
}

Можно вовсе поместить инструкцию на одной строке с условием:

if(a == 8)  std::cout << "a == 8" << std::endl;

if..else

Также мы можем использовать полную форму конструкции if, которая включает оператор else:

if(выражение_условия)
{
	инструкция_1
}
else
{
	инструкция_2
}

После оператора else мы можем определить набор инструкций, которые выполняются, если условие в операторе if возвращает false. То есть если условие истинно, выполняются инструкции после оператора if, а если это выражение ложно, то выполняются инструкции после оператора else.

#include <iostream> 

int main()
{
    int n {21};
    if (n > 22)
    {
        std::cout << "n > 22" << std::endl;
    }
    else
    {
        std::cout << "n <= 22" << std::endl;
    }
}

В данном случае условие n > 22 ложно, то есть возвращает false, поэтому будет выполняться блок else. И в итоге на консоль будет выведена строка "n <= 22".

if-else

Однако нередко надо обработать не два возможных альтернативных варианта, а гораздо больше. Например, в случае выше можно насчитать три условия: переменная n может быть больше 22, меньше 22 и равна 22. Для проверки альтернативных условий мы можем вводить выражения else if:

#include <iostream> 

int main()
{
    int n {21};
    if (n > 22)
    {
        std::cout << "n > 22" << std::endl;
    }
    else if (n < 22)
    {
        std::cout << "n < 22" << std::endl;
    }
    else
    {
        std::cout << "n == 22" << std::endl;
    }
}

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

Подобных альтернативных условий с помощью выражения else if можно вводить больше одного:

#include <iostream> 

int main()
{
    int n {21};
    if (n == 20)
    {
        std::cout << "n == 20" << std::endl;
    }
    else if(n==21)
    {
        std::cout << "n == 21" << std::endl;
    }
    else if(n==22)
    {
        std::cout << "n == 22" << std::endl;
    }
    else if(n==23)
    {
        std::cout << "n == 23" << std::endl;
    }
}

Если в блоке if или else или else-if необходимо выполнить только одну инструкцию, то фигурные скобки можно опустить:

#include <iostream> 

int main()
{
    int n {21};
    if (n > 22)
   		std::cout << "n > 22" << std::endl;
    else if (n < 22)
    	std::cout << "n < 22" << std::endl;
    else
    	 std::cout << "n == 22" << std::endl;
}

Целочисленные условия

Стоит отметить, что если вместо значений типа bool передаются целые числа, то они преобразуются к типу bool - для нулевых значений возвращается false, для ненулевых - true, например:

#include <iostream> 

int main()
{
    int a {8};
    // a = true
    if(a) std::cout << "a = true" << std::endl; 
    else  std::cout << "a = false" << std::endl; 
    
    int b {};
    // b = false
    if(b) std::cout << "b = true" << std::endl; 
    else  std::cout << "b = false" << std::endl; 
}

Здесь переменная a равна 8, соответственно условие if(a) будет равно true. А вот переменная b по умолчанию равна 0, поэтому условие в if(b) возвращает false.

Вложенные конструкции

Конструкции if..else могут быть вложенными. Например:

#include <iostream> 

int main()
{
    int a {5};
    int b {8};
    if(a==5)
    {
        if(b==8)
        { 
            std::cout << "b == 8" << std::endl;
        }
        else
        {
            std::cout << "b != 8" << std::endl;
        }
        std::cout << "a == 5" << std::endl;
    }
    else
    {
        std::cout << "a != 5 " << std::endl;
    }
}

Здесь, если a == 5, то выполнение переходит к вложенноей конструкции if(b==8), которая проверяет условие b==8 и выполняет либо блок if, либо блок else.

Блок if с инициализацией переменной

Иногда в конструкции if для различных промежуточных вычислений необходимо определить переменную. Мы можем это сделать непосредственно в блоке кода. Однако начиная со стандарта C++17 язык С++ поддерживает особую форму конструкции if:

if(инициализация; условие) 
{
    // инструкции
}

Подобная форма также принимает условие, только перед ним еще может идти определение и инициализация переменной. Например:

#include <iostream>
  
int main()
{
    int a {5};
    int b {3};
       
    if(int c {a - b}; a > b)
    {
        std::cout << "a=" << a << "; c=" << c << std::endl;
    }
    else
    {
        std::cout << "b=" << b << "; c=" << c << std::endl;
    }
}

В данном случае выражение инициализации int c {a - b} представляет определение и инициализацию переменной c. Дальше идет условие a > b. Если оно верно, то выполняется инструкция

std::cout << "a=" << a << "; c=" << c << std::endl;

иначе выполняется инструкция

std::cout << "b=" << b << "; c=" << c << std::endl;

Но в обоих случаях мы можем использовать переменную c. Вне конструкции if-else переменная c не доступна.

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

#include <iostream>
 
int main()
{
    int a {5};
    int b {3};
      
    if(int rem {a % b}; rem == 0)
    {
        std::cout << "a divisible by b" << std::endl;
    }
    else
    {
        std::cout << "remaining of a / b = " << rem << std::endl;
    }
}

В данном случае в конструкции if определяется переменная rem, которая представляет остаток от деления a на b.

Тернарный оператор

Тернарный оператор в некотором роде похож на конструкцию if-else. Он принимает три операнда в следующем виде:

операнд1? операнд2 : операнд3

Первый операнд представляет условие. Если это условие верно (равно true), тогда выбирается/выполняется второй операнд, который помещается после символа ?. Если условие не верно, тогда выбирается/выполняется третий операнд, который помещается после двоеточия.

Например, возьмем следующую конструкцию if-else:

#include <iostream> 

int main()
{
    int a {5};
    int b {8};
    int c{};
    if(a > b)
    {
        c = a - b;
    }
    else
    {
        c = a + b;
    }
    std::cout << "c = " << c << std::endl;  // c = 13
}

Здесь если a больше b, то c=a-b, иначе c=a+b. Перепишем ее с помощью тернарного оператора:

#include <iostream> 

int main()
{
    int a {5};
    int b {8};
    int c = a > b ? a - b : a + b;

    std::cout << "c = " << c << std::endl;  // c = 13
}

Здесь первым операндом тернарного оператора является условие a > b. Если это условие верно, то возвращается второй операнд - результат выражения a - b. Если условие не верно, то возвращается третий операнд - a + b. И возвращенный операнд присваивается переменной c.

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

#include <iostream> 

int main()
{
    int a {5};
    int b {8};
    a > b ? std::cout << a-b : std::cout << a+b;
}

Здесь тот же первый операнд-условие. Если оно верно, выполняется второй операнд - std::cout << a-b, если нет, то третий операнд - std::cout << a+b.

В рамках одного тернарного оператора можно комбинировать несколько других. Например:

#include <iostream> 

int main()
{
    int a {5};
    int b {8};
    std::cout << (a < b ? "a is less than b" :
        (a == b ? "a is equal to b" : "a is greater than b"));
}

Здесь условие представляет выражение a < b. Если оно верно, то возвращается второй операнд - строка "a is less than b". Но если условие не верно, то возвращается третий операнд, который, в свою очередь, представляет другой тернарный оператор (a == b ? "a is equal to b" : "a is greater than b"). Здесь опять же оценивается условие-первый операнд a == b. Если оно верно, то возвращается строка "a is equal to b". Если нет, то строка - "a is greater than b".

Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850