
4.3. Логический тип и логические выражения
К предопределённым (ещё точнее - к базовым или простым) типам значений относится тип bool, используемый для представления логических (булевых) значений. Константами-литералами булева типа являются true (истина) и false (ложь).
Переменные типа bool не могут принимать значений, отличных от логических литералов. Им нельзя присваивать значений других типов, например, целочисленных. Логическое значение (типа bool) нельзя преобразовать ни в какое значение другого типа.
Объявление с инициализацией логической переменной:
bool realy=true;
Из логических переменных и констант формируются логические (булевы) выражения. Для этого в языке С# имеются логические операции:
& - конъюнкция (логическое И);
| - дизъюнкция (логическое ИЛИ);
! - логическое отрицание;
^ - взаимоисключающее ИЛИ.
Семантика этих операций известна из курса математической логики.
Кроме того в С# определены две условные (conditional) логические бинарные операции:
&& - условная конъюнкция (условное И);
|| - условная дизъюнкция (условное ИЛИ).
В выражении х&&у значение у не вычисляется, если х имеет значение false. В выражении х||у значение у не вычисляется, если х равно true.
Кроме данных типа bool в логических выражениях часто используются отношения. Отношение - это два операнда, соединённые (или разделённые) знаком операции отношений:
> больше;
>= больше или равно;
< меньше;
<= меньше или равно;
== сравнение на равенство (равно);
!= сравнение на неравенство (не равно);
Отметим, что операции сравнения на равенство (== и !=) имеют более низкий приоритет, нежели все остальные операции отношений.
Проверку принадлежности числового значения х интервалу (а, b), где а<=b, можно выполнить с помощью такого логического выражения:
х<b & а<х
Последовательность вычислений можно показать с помощью скобок:
(х<b) & (а<х)
Значением выражения будет true, если х принадлежит интервалу (а, b).
Проверку истинности высказывания "значение х находится вне интервала (а,b)" позволяют выполнить логические выражения:
х>b ^ x<а;
х>b | х<а;
х>b || х<а.
В третьем выражении использована условная дизъюнкция. Остановимся подробнее на её особенностях.
Условные версии (|| и &&) бинарных логических операций (& и |) позволяют избежать вычисления значения второго (правого) операнда логического выражения, если значению левого операнда однозначно определяет значение всего выражения. Проверку принадлежности х числовому интервалу (а,b) можно записать так:
х<и && а<х
Если х<b равно false, то нет необходимости вычислять значение отношения а<х.
Обратите внимание, что знаки бинарных логических операций те же, что и знаки поразрядных операций конъюнкции (&.) и дизъюнкции (|). То же самое относится и к знаку ^, который для целочисленных операндов обозначает операцию поразрядного взаимоисключающего ИЛИ. Как и в (уже упомянутом) случае применения знака + для обозначения операции конкатенации строк, здесь имеет место перегрузка операций. Это ещё один пример полиморфизма.
Нелишним будет в связи с перегрузкой операций вспомнить, что символом в информатике называют знак с его смыслом [15]. Встретив в выражениях знак &, компилятор анализирует контекст и если обнаруживается, что справа и слева операнды типа bool, то знак & воспринимается как символ логической операции конъюнкции.
Следующая программа "проверяет" три вещественных переменных х, у, z -могут ли быть их значения длинами сторон треугольника.
// 04_02.cs - отношения и логические
static void Main()
{
double x = 19, y = 31, z = 23.8;
bool res;
res = x < y + z & y < x + z & z < x + y;
Console.WriteLine("res = " + res);
}
Результат выполнения программы: res = True
В программе логической переменной res присваивается значение логического выражения в виде конъюнкции трёх отношений. Для заданных значений переменных х, у, z результат true с помощью метода Console.WriteLine() выводится как True...
Обратите внимание на порядок вычисления использованного в программе логического выражения. С помощью круглых скобок последовательность выполнения операций можно указать явно таким образом:
((x< = (y+z)) & (y< = (x+z))) & (z< = (x+y))
Необходимости в таком применении скобок нет - в языке С# определены приоритеты (ранги) всех операций (см. Табл. 3.1). В соответствии с этими приоритетами, первыми в нашем логическом выражении вычисляются значения (типа double) операндов отношений (т.е. выполняется операция сложения +). Затем последовательно слева-направо вычисляются значения (типа bool) отношений и к этим логическим значениям применяется слева-направо операция & (конъюнкция).
Результат выполнения программы не изменится, если при вычислении логического выражения использовать условную конъюнкцию:
Res=x<y+z && y<x+z && z<x+y;
Однако при получении значения false в любом из отношений, отношения левее него не вычисляются.
Применение условных логических операций удобно в тех случаях, когда истинности одного условия позволяет избежать аварийных ситуаций при вычислении второго условия.