Условные конструкции


Условные конструкции направляют ход программы по одному из возможных путей в зависимости от условия.

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

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

Например:

#include <iostream>

int main()
{
int x = 60;

if(x > 50)
{
std::cout << "x is greater than 50 \n";
}

if(x < 30)
{
std::cout << "x is less than 30 \n";
}

std::cout << "End of Program" << "\n";
return 0;
}
Здесь определены две условных конструкции if. Они проверят больше или меньше значение переменной x, чем определенное значение. В качестве инструкции в обоих случаях выполняется вывод некоторой строки на консоль.

В первом случае x > 50 условие истинно, так как значение переменной x действительно больше 50, поэтому это условие возвратит true, и, следовательно, будут выполнятся инструкции, которые входят в блок if.

Во втором случае операция отношения x < 30 возвратит false, так как условие ложно, поэтому последующий блок инструкций выполняться не будет. В итоге при запуске программы вывод консоли будет выглядеть следующим образом:

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

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

int x = 50;
if(x > 60)
std::cout << "x is greater than 60 \n";
else
std::cout << "x is less or equal 60 \n";
В данном случае условие x > 60 ложно, то есть возвращает false, поэтому будет выполняться блок else. И в итоге на консоль будет выведена строка "x is less or equal 60 \n".

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

int x = 60;

if(x > 60)
{
std::cout << "x is greater than 60 \n";
}
else if (x < 60)
{
std::cout << "x is less than 60 \n";
}
else
{
std::cout << "x is equal 60 \n";
}
То есть в данном случае мы получаем три ветки развития событий в программе.

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

int x = 60;

if(x > 60)
std::cout << "x is greater than 60 \n";
else if (x < 60)
std::cout << "x is less than 60 \n";
else
std::cout << "x is equal 60 \n";
Конструкция switch
Другую форму организации ветвления программ представляет конструкция switch...case. Она имеет следующую форму:

switch(выражение)
{
case константа_1: инструкции_1;
case константа_2: инструкции_2;

default: инструкции;
}
После ключевого слова switch в скобках идет сравниваемое выражение. Значение этого выражения последовательно сравнивается со значениями после оператора сase. И если совпадение будет найдено, то будет выполняться определенный блок сase.

В конце конструкции switch может стоять блок default. Он необязателен и выполняется в том случае, если значение после switch не соответствует ни одному из операторов case. Например:

#include <iostream>

int main()
{
int x = 2;

switch(x)
{
case 1:
std::cout << "x = 1" << "\n";
break;
case 2:
std::cout << "x = 2" << "\n";
break;
case 3:
std::cout << "x = 3" << "\n";
break;
default:
std::cout << "x is undefined" << "\n";
break;
}
return 0;
}
Чтобы избежать выполнения последующих блоков case/default, в конце каждого блока ставится оператор break. То есть в данном случае будет выполняться оператор

case 2:
std::cout << "x = 2" << "\n";
break;
После выполнения оператора break произойдет выход из конструкции switch..case, и остальные операторы case будут проигнорированы. Поэтому на консоль будет выведена следующая строка

x = 2
Стоит отметить важность использования оператора break. Если мы его не укажем в блоке case, то после этого блока выполнение перейдет к следующему блоку case. Например, уберем из предыдущего примера все операторы break:

#include <iostream>

int main()
{
int x = 2;

switch(x)
{
case 1:
std::cout << "x = 1" << "\n";
case 2:
std::cout << "x = 2" << "\n";
case 3:
std::cout << "x = 3" << "\n";
default:
std::cout << "x is undefined" << "\n";
}
return 0;
}
В этом случае опять же будет выполняться оператор case 2:, так как переменная x=2. Однако так как этот блок case не завершается оператором break, то после его завершения будет выполняться набор инструкций после case 3: даже несмотря на то, что переменная x по прежнему равна 2. В итоге мы получим следующий консольный вывод:

x = 2
x = 3
x is undefined
Тернарный оператор
Тернарный оператор ?: позволяет сократить определение простейших условных конструкций if и имеет следующую форму:

[первый операнд - условие] ? [второй операнд] : [третий операнд]
Оператор использует сразу три операнда. В зависимости от условия тернарный оператор возвращает второй или третий операнд: если условие равно true (то есть истинно), то возвращается второй операнд; если условие равно false (то есть ложно), то третий. Например:

#include <iostream>

int main()
{
setlocale(LC_ALL, "");
int x = 5;
int y = 3;
char sign;
std::cout << "Введите знак операции: ";
std::cin >> sign;
int result = sign=='+'?x + y:x - y;
std::cout << "Результат: " << result << "\n";
return 0;
}
В данном случае производится ввод знака операции. Здесь результатом тернарной операции является переменная result. И если переменная sign содержит знак "+", то result будет равно второму операнду - (x+y). Иначе result будет равно третьему операнду.