Операторы выбора (разветвляющиеся алгоритмы)
К операторам выбора, называемым операторами ветвления, относят условный оператор (if …else) бинарного ветвления и оператор-переключатель (switch) m-арного ветвления. Они слу жат для выбора пути выполнения разветвляющейся программы.
Синтаксис условного оператора:
if (выражение) оператор_1 else оператор_2
выражение должно быть простым (скалярным) и может иметь логический тип, арифметический тип или тип указателя. Если арифметическое выражение не равно нулю (или не есть пустой указатель), то его значение приводится к true, условие считается истинным и выполняется оператор_1. В противном случае, когда выражение равно нулю (false), выполняется оператор_2. В ка честве операторов нельзя использовать описания и определения. Однако могут быть составные операторы и блоки.
Допустима сокращенная форма условного оператора, в которой отсутствует ветвь else и оператор_2. В этом случае при ложном значении выражения выполняется оператор, следующий за условным оператором.
|
|
Операторы оператор_1 и/или оператор_2, в свою очередь, могут быть условными (как полными, так и сокращёнными), что позволяет организовать цепочку проверок условий любой глубины вложенности. Синтаксис языка предполагает, что при вложениях условных операторов каждое else соответствует ближайшему к нему предшествующему if.
Рассмотрим программу, в которой вводятся с клавиатуры два целых числа. Если второе число отлично от нуля, то выполняется целочисленное деление.
// Листинг 4.1
#include <iostream>
using namespace std;
int main() {
int a, b;
cout << "Input 2 digits: ";
cin >> a >> b; // Ввод двух чисел с клавиатуры
// Выполнение целочисленного деления
if (b) cout << "a/b = " << a/b << endl;
else cout << "Error!!!\n";
return 0;
}
Если b равно 0, то выражение в операторе if является ложным, и выполняется ветвь else. В противном случае условие является истинным, и выполняется деление a/b.
Результат выполнения программы:
Input 2 digits: 4 5
a/b = 0
или
Input 2 digits: 10 0
Error!!!
Оператор-переключатель является наиболее удобным средством для организации множественного (мульти-) ветвления. Синтаксис переключателя:
switch (переключающее_выражение)
{
case константное_выражение_1: оператор_1;
case константное_выражение_2: оператор_2;
…
case константное_выражение_n: оператор_n;
default: операторы;
}
Управляющая конструкция switch передаёт управление тому из помеченных с помощью case операторов, для которого значение константного_выражения совпадает со значением переключающего_выражения. Значение переключающего_вы ражения должно быть целочисленным или приводиться к целому. Значения константных выражений, помещаемых за словами case, также приводятся к целому типу переключающего выражения. В одном переключателе все константные выражения должны быть одного типа и иметь различные значения.
|
|
Оператор каждой ветви case и ветви default может быть как отдельным оператором, так и составным или блоком (в нём могут находиться описания переменных, область видимости которых – этот блок). В конце составного оператора каждой ветви следует использовать оператор break, т.к. в противном случае выполнятся все операторы всех ветвей, расположенных после выбранной.
Если значение переключающего выражения не совпадает ни с одним из константных выражений, то выполняется переход к оператору, отмеченному меткой default.В каждом переключателе должно быть не больше одной метки default, однако эта метка может отсутствовать. В случае отсутствия метки default при несовпадении переключающего выражения ни с одним из константных выражений, помещаемых вслед за case, в переключателе не выполняется ни один из операторов. Если не предусмотрены переходы или выходы из переключателя, то в нём последовательно выполняются все операторы, начиная с той метки, которой передано управление.
После switch() может находиться любой оператор (не обязательно составной), помеченный с использованием служебного слова case. Однако без фигурных скобок такой оператор может быть только один, и смысл переключателя теряется: он превращается в разновидность сокращённого условного оператора.
Рассмотрим программу, в которой выводятся названия нечётных десятичных цифр, не меньших введённой с клавиатуры.
// Листинг 4.2
#include <iostream>
using namespace std;
int main() {
int n;
cout << "Enter decimal digit: ";
cin >> n;
switch(n) {
case 0: case 1: cout << "one, ";
case 2: case 3: cout << "three, ";
case 4: case 5: cout << "five, ";
case 6: case 7: cout << "seven, ";
// Выход из переключателя по оператору break
case 8: case 9: cout << "nine\n"; break;
default: cout <<"Error! It isn't digit!\n";
} // Конец переключателя
return 0;
}
Результат выполнения программы:
Enter decimal digit: 3
three, five, seven, nine
Если необходимо, чтобы выполнялись операторы лишь одной ветви case переключателя, нужно в конце каждой ветви использовать оператор break.
Операции сравнения (отношения)
К операциям сравнений относятся следующие:
< - меньше, чем;
> - больше, чем;
<= - меньше или равно;
>= - больше или равно;
== - равно (сравнение на равенство);
!= - не равно (сравнение на неравенство);
Для двух последних операций введено специальное название "операции сравнения на равенство". Операнды в операциях отношений могут быть арифметических типов или указателями. Результат – логического типа: false (ложь, т.е. 0 в стиле С) или true (истина, т.е. 1 в стиле С). Последние две операции (операции сравнения на равенство) имеют более низкий приоритет по сравнению с остальными операциями сравнения.
Рассмотрим программу с использованием операций сравнения и логических операций.
// Листинг 4.3
#include <iostream>
using namespace std;
int main() {
cout << "3 < 5 equal " << (3 < 5) << '\n';
cout << "3 > 5 equal " << (3 > 5) << '\n';
cout << "3 == 5 equal " << (3 == 5) << '\n';
cout << "3!= 5 equal " << (3!= 5) << '\n';
cout << "3!= 5 || 3 == 5 equal "
<< (3!= 5 || 3 == 5) << '\n';
cout << "3+4 >= 7 && 3+5 > 8 equal "
<< (3+4 >= 7 && 3+5 > 8)<<'\n';
return 0;
}
Результат выполнения программы:
3 < 5 equal 1
3 > 5 equal 0
3 == 5 equal 0
3!= 5 equal 1
3!= 5 || 3 == 5 equal 1
3+4 >= 7 && 3+5 > 8 equal 0
Тернарная (условная) операция
Условная операция используется с тремя операндами. В выражении с условной операцией используются три операнда и два символа? и:.
Синтаксис условной операции: