Булев тип данных

Логический тип

Значениями логического типа BOOL может быть одна из предварительно объявленных констант false (ложь) или true (истина).

Данные логического типа занимают один байт памяти. При этом значению false соответствует нулевое значение байта, а значению true соответствует любое ненулевое значение байта.

Например:

false всегда в машинном представлении: 00000000;

true может выглядеть таким образом: 00000001 или 00010001 или 10000000.

Однако следует иметь в виду, что при выполнении операции присваивания переменной логического типа значения true в соответствующее поле памяти всегда записывается код 00000001.

Над логическими типами возможны операции булевой алгебры - НЕ (!), ИЛИ ( || ), И ( && ), исключающее ИЛИ ( ^ ) - последняя реализована для логического типа не во всех языках. В этих операциях операнды логического типа рассматриваются как единое целое - вне зависимости от битового состава их внутреннего представления.

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

Интересно, что в языке C данные логического типа отсутствуют, их функции выполняют данные числовых типов, чаще всего - типа int. В логических выражениях операнд любого числового типа, имеющий нулевое значение, рассматривается как "ложь", а ненулевое - как "истина". Результатами логического типа являются целые числа 0 (ложь) или 1 (истина). В С++ появился логический тип BOOL, но его ввели исключительно для удобства программирования, и он ни как не влияет на возможность использования других типов в логических выражениях как в С.

 

Для булева типа данных, bool, в С# определены два значения true и false (истина и ложь). Следовательно, переменная типа bool или логическое выражение будут иметь одно из этих двух значений. Более того, не существует способа преобразования значений типа bool в целочисленные значения. Например, значение 1 не преобразуется в значение true, а значение 0 - в значение false.

Приведем программу, демонстрирующую использование типа данных bool.

// Программа демонстрирует использование
// переменной, имеющей тип bool.

using System;

class BoolDemo {
public static void Main() {
bool b;

b = false;
Console.WriteLine("Переменная b имеет значение " + b);
b = true;
Console.WriteLine("Переменная b имеет значение " + b);

// Булева переменная может управлять условным оператором if.
if(b) Console.WriteLine("Этот оператор будет выполнен.");
Булева переменная может управлять условным оператором if.

b = false;
if(b) Console.WriteLine("Этот оператор не будет выполнен.");
// Условный оператор возвращает булево значение.
Console.WriteLine("(10 > 9)-это " + (10 > 9));
}
}

Ниже представлен результат, сгенерированный этой программой:

Переменная b имеет значение False
Переменная b имеет значение True
Этот оператор будет выполнен.
(10 > 9) - это True

Обратите внимание на некоторые особенности использования булевой переменной. Во-первых, при выводе значения типа bool с помощью метода WriteLine() на экран выводится слово true или false. Во-вторых, используя переменную типа bool, можно управлять оператором if. Если условием выполнения оператора if является истинность переменной (в данной программе переменной b), то нет необходимости записывать оператор if так:

if(b == true)...

достаточно более короткого выражения:

if(b)

В-третьих, результатом выполнения оператора сравнения, такого как <, является значение типа bool. Вот почему выражение 10 > 9 выводит на экран значение true. Далее, дополнительная пара скобок, в которые заключено выражение 10 > 9, является необходимой, поскольку оператор + имеет больший приоритет, чем оператор >.

 

Операторы сравнения и логические операторы В терминах оператор сравнения и логический оператор слово сравнение означает оценку одного значения по сравнению с другим, а слово логический - способ, которым можно связать значения true и false (истина и ложь) в выражении. Поскольку результатом выполнения операторов сравнения являются булевы значения, эти операторы часто работают совместно с логическими операторами. Поэтому их можно рассматривать вместе.

Ниже представлены операторы сравнения.

Оператор Значение
== Равно
!= Не равно
> Больше чем
< Меньше чем
>= Больше или равно
<= Меньше или равно

Далее перечислены логические операторы.

Оператор Значение
& AND (И)
| OR (ИЛИ)
^ XOR (исключающее ИЛИ)
&& Short-circuit AND (быстрый оператор И)
|| Short-circuit OR (быстрый оператор ИЛИ)
! NOT (НЕ)

Результатом выполнения операторов сравнения и логических операторов являются значения типа bool.

В C# операторы == и!= могут применяться ко всем объектам для их сравнения на предмет равенства или неравенства. Операторы сравнения <, >, <=, >= применимы только к перечисляемым типам данных, которые упорядочены в своей структуре (например, упорядоченная структура чисел 1, 2, 3 и так далее или упорядоченные символы букв алфавита). Следовательно, все операторы сравнения могут применяться ко всем числовым типам данных. Однако значения типа bool могут сравниваться только на предмет равенства или неравенства, поскольку значения true и false не упорядочены. Например, выражение true > false в языке C# не имеет смысла.

Для логических операторов операнды должны иметь тип bool. Результатом логических операций также являются значения, имеющие тип bool. Логические операторы &, |, ^ и! поддерживают базовые логические операции AND, OR, XOR и NOT соответственно, результаты выполнения которых соответствуют значениям, приведенным в следующей таблице истинности.

p q p & q p q p ^ q
false false false false false true
true false false true true false
false true false true true true
true true true true false false

Например, из таблицы видно, что результатом выполнения оператора XOR будет значение true, если только один его операнд имеет значение true.

Рассмотрим программу, в которой демонстрируется несколько операторов сравнения и логических операторов:

// В программе демонстрируется использование логических операторов
// и операторов сравнения.

using System;

class RelLogOps {
public static void Main() {
int i, j;
bool b1, b2;

i = 10;
j = 11;
if(i < j) Console.WriteLine("i < j");
if(i <= j) Console.WriteLine("i <= j");
if(i != j) Console.WriteLine("i != j");
if(i == j) Console.WriteLine("Эта строка не будет выведена.");
if(i >= j) Console.WriteLine("Эта строка не будет выведена.");
if(i > j) Console.WriteLine("Эта строка не будет выведена.");

b1 = true;
b2 = false;
if(b1 & b2) Console.WriteLine("Эта строка не будет выведена.");
if(!(b1 & b2)) Console.WriteLine("Результатом вычисления"+
" выражения !(b1 & b2) будет значение true.");
if(b1 | b2) Console.WriteLine("Результатом вычисления"+
" выражения b1 | b2 будет значение true.");
if(b1 ^ b2) Console.WriteLine("Результатом вычисления"+
" выражения b1 ^ b2 будет значение true.");
}
}

Результат выполнения программы следующий:

i < j
i <= j
i != j

Результатом вычисления выражения !(b1 & b2) будет значение true.

Результатом вычисления выражения b1 | b2 будет значение true.

Результатом вычисления выражения b1 ^ b2 будет значение true.