Условные конструкции
Условные конструкции направляют ход программы по одному из возможных путей в зависимости от условия.
Конструкция 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 будет равно третьему операнду.