Скачиваний:
67
Добавлен:
24.03.2015
Размер:
169.98 Кб
Скачать

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 в любом из отношений, отношения левее него не вычисляются.

Применение условных логических операций удобно в тех случаях, когда истинности одного условия позволяет избежать аварийных ситуаций при вычислении второго условия.

Соседние файлы в папке Lekc_C#