В языке С++ присутствует две логические константы: «true» (истина) и «false» (ложь). Логическая переменная может принять любое из этих значений и имеет тип boolean. Логические данные широко используются при проверке правильности некоторых условий и при сравнении величин. Результат может оказаться «истинным» или «ложным». Над логическими данными допускаются следующие операции (см. табл. 2.1). Операция отрицания «!» дает противоположное логическое значение переменной, операции «&&» («и») и «||» («или») реализуют соответственно логические конъюнкцию и дизъюнкцию, операция «^=» (или «исключающее или») реализует обратную эквиваленцию.
Таблица 2.1. Логические операции языка С++
A | B | !A | A && B | A || B | A ^= B |
true | true | false | true | true | false |
true | false | false | false | true | true |
false | true | true | false | true | true |
false | false | true | false | false | false |
Соответственно операциям на языке С++ существуют операции сравнения, которые представлены в таблице 2.2.
Таблица 2.2. Операции сравнения языка С++
Операция | Краткое описание |
! | логическое отрицание |
< | меньше |
<= | меньше или равно |
> | больше |
>= | больше или равно |
= = | равно по значению |
= = = | равно по значению и типу переменной |
!= | не равно |
& | поразрядная конъюнкция (И) |
^ | поразрядное исключающее ИЛИ |
| | поразрядная дизъюнкция (ИЛИ) |
&& | логическое И |
|| | логическое ИЛИ |
&= | поразрядное И с присваиванием |
|= | поразрядное ИЛИ с присваиванием |
^= | поразрядное исключающее ИЛИ с присваиванием |
Для программирования ветвлений в языке С++ используются условный оператор if, операция условия (?), оператор-переключатель (switch).
Условный оператор обеспечивает выполнение или невыполнение некоторого оператора или их группы в зависимости от заданного условия. Оператор if является одним из самых популярных средств, изменяющих порядок выполнения программы. Описание оформления оператора if на языке С++ можно показать на примере, допустим существуют два числа a, b, необходимо вывести на экран большее. В коде это будет выглядеть так:
…
if (a>b) {cout << a;} else {cout << b;}
…
Например, простая программа, реализующая сравнение трех чисел a, b, c и вывод максимального из них на экран будет выглядеть следующим образом:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
setlocale(LC_ALL,»Rus»);
int a,b,c;
cout<<«Enter three numbers»<<«\n»;
cin>>a>>b>>c;
if (a>b) {
if (a>c) cout<<«Maximum is «<<a;
else cout<<«Maximum is «<<c;
}
else {
if (b>c) cout<<«Maximum is «<<b;
else cout<<«Maximum is «<<c;
}
return 0;
}
При этом фигурные скобки можно опустить, если при выполнении или невыполнении условия реализуется одна команда.
В случае, когда условие предполагает одно действие в случае выполнения или невыполнения, можно также использовать оператор условия (?). Данный оператор унаследован языком С++ от предшественника, языка С. Его использование очень редко, обычно в тех случаях, когда необходима простая проверка. В таком случае выражение приобретает большую четкость. Покажем это на примере сравнения двух чисел:
…
(a>b) ? cout << a: cout << b
…
Поясним вышеприведенный пример. Сначала в скобках указывается условие, которое необходимо проверить. Далее ставится вопросительный знак, который компилятор считает за завершение ввода условия. После этого пишется действие, выполняемое в случае выполнения условия, через двоеточие действие, выполняемое в том случае, если условие не выполнено. в функциональном смысле оператор схож с условным оператором.
В случае, когда необходим множественный выбор, лучше использовать оператор-переключатель (switch). Формат переключателя имеет следующий вид:
…
switch (выражение)
{
case константа1: операторы1;
case константа2: операторы2;
…
case константаN: операторыN;
default: операторы;
}
…
В данном операторе используются три служебных оператора: switch, case, default. Первый идентифицирует переключатель. Оператор case со значением выполняет роль «метки». Встретив нужную «метку», программа выполняет операторы, относящиеся только к данной «метке», игнорируя остальные. Оператор default служит для того, чтобы в случае несовпадения ни с одной из учтенных «меток» выполнить некоторые операторы по умолчанию.
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
setlocale(LC_ALL,»Rus»);
int c;
cout<<«\nВведите цифру от 1 до 7:\n»;
cin>>c;
cout<<«\nСоответствующий день недели: «;
switch(c){
case 1:{cout<<«\nПонедельник!»; break;}
case 2:{cout<<«\nВторник!»; break;}
case 3:{cout<<«\nСреда!»; break;}
case 4:{cout<<«\nЧетверг!»; break;}
case 5:{cout<<«\nПятница!»; break;}
case 6:{cout<<«\nСуббота!»; break;}
case 7:{cout<<«\nВоскресенье!»; break;}
default: cout<<«\nВведено неверное число»;
}
return 0;
}
Оператор default может отсутствовать в программе, в таком случае при отсутствии совпадений программа не выполнит никаких действий. Например, по введенному числу выводится день недели. Применение оператора switch будет следующим:
Из примера видно, что анализируемая переменная с помещается после оператора switch. Ее значение сравнивается поочередно со значениями, стоящими после case. Если совпадение произошло, то выполняется соответствующая ветвь. Если не выявлено ни одного совпадения, выдается сообщение об ошибке.
Существует возможность определения выбора из нескольких вариантов. Это требуется, когда для некоторого количества возможных значений нужно произвести одну группу действий. Например, если необходимо вывести день недели по числу месяца:
#include <stdio.h>
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
setlocale(LC_ALL,»Rus»);
int c;
printf(«\nВведите цифру от 1 до 31:\n»);
scanf(«%d»,&c);
printf(«\nСоответствующий день недели: «);
switch(c){
case 1: case 8: case 15: case 22: case 29: printf(«\nПонедельник!»); break;
case 2: case 9: case 16: case 23: case 30: printf(«\nВторник!»); break;
case 3: case 10: case 17: case 24: case 31: printf(«\nСреда!»); break;
case 4: case 11: case 18: case 25: printf(«\nЧетверг!»); break;
case 5: case 12: case 19: case 26: printf(«\nПятница!»); break;
case 6: case 13: case 20: case 27: printf(«\nСуббота!»); break;
case 7: case 14: case 21: case 28: printf(«\nВоскресенье!»); break;
default: printf(«\nВведено неверное число»);
}
return 0;
}