Типов данных в информатике великое множество. Они подразделяются на ссылочные типы и типы значений. Типы значений работают обычно быстрее, потому что хранятся в стеке и управляются напрямую. Это численные переменные и логические типы данных. Ссылочные хранят в стеке ссылку на кучу, а в куче уже находится реализация типа. Ссылочные типы данных — это строковые переменные, динамические или глобальные переменные, встроенные или пользовательские классы.
2 ноября 1815 года в Англии родился человек, ставший известнейшим математиком и логиком, Джордж Буль. Именно в честь него назван один из типов данных в программировании — Boolean, логический тип данных.
Тип данных boolean — это «примитивный» тип. Распространен он повсеместно: использовался в языке программирования Algol 60 (1960-е), Fortran, Pascal, C++, есть во всех современных языках программирования. Булева переменная замечательна тем, что имеет только два значения: ИСТИНА (true, 1) или ЛОЖЬ (false, 0). Обычно реализуется через численный тип данных, более того, большинство языков программирования позволяют использовать ее и в арифметических операциях, предварительно приведя к численному типу, исходя из правил приведения типов для конкретного языка программирования.
Низкий уровень
Булевый тип данных — это значимый тип. В ОЗУ переменные типа bool хранятся в стеке, то есть обращение и размещение такой переменной происходит очень быстро.
Легко предположить, что для реализации такого простого типа достаточно 1 бита (0 или 1), но на деле из-за особенностей архитектуры процессоров под логический тип данных резервируется минимальная адресуемая ячейка памяти - байт, а если указывать точнее, то машинное слово. Это облегчает работу процессора и ОЗУ. Например:
00000000 — false
00000001 или 00010001 или 100000 - true
Но при выполнении присваивания в булеву переменную значения ИСТИНА в машинном коде всегда записывается значение 00000001.
Логический тип данных. Логические операции
В распространенных языках программирования тип boolean поддерживает несколько операций, мы разберем следующие:
- ЛОГИЧЕСКОЕ И (AND && *).
- ЛОГИЧЕСКОЕ ИЛИ (OR | +).
- ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR ^).
- РАВЕНСТВО (EQV ==).
- НЕРАВЕСТВНО (NOT !=).
- ОПЕРАЦИИ СРАВНЕНИЯ (> < <= >=).
Булевы типы данных. Примеры. Логическое И
Оператор && возвращает истину, если оба аргумента являются истиной.
using System;
namespace Boolean
{
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine(true&&false);
Console.ReadLine();
}
}
}
В данном примере второе условие — ЛОЖЬ, значит, в консоль выведется false.
Логическое ИЛИ
Оператор || возвращает истину, если хотя бы один из аргументов является истиной.
using System;
namespace Boolean
{
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine(true||false);
Console.ReadLine();
}
}
}
В данном примере одно из условий — ИСТИНА, значит, в консоль выведется true.
Исключающее ИЛИ
Оператор ^ (не путать с возведением в степень) возвращает истину, если только один из аргументов является истиной.
using System;
namespace Boolean
{
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine(true^true);
Console.ReadLine();
}
}
}
В данном примере оба аргумента истинны, значит, в консоль выведется false.
Равенство и неравенство
Оператор == возвращает истину, если оба условия равны. Оператор != возвращает истину, если оба условия не равны.
using System;
namespace Boolean
{
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine(true!=false);
Console.ReadLine();
}
}
}
В консоли будет true, потому что условие выполняется.
Выше были рассмотрены примеры на языке C#. В этом языке для операций логического типа определены два значения — true и false. И здесь запрещается преобразовывать булевы значения в целочисленные, компилятор выдаст ошибку. Как несложно подметить, при передаче в метод WriteLine класса Console булевой переменной на консоль выводится ее значение.
Также булева переменная может управлять оператором if. Если условие выполнения выражения с if — истинность переменной, то выражение можно сократить до:
if(x) {/*...do smth...*/}
Операции сравнения
Операторы >= <= > < могут использовать любые численные типы данных, включая булевы.
В языке C, если переменная содержит 0, то ее булево значение эквивалентно ЛОЖЬ, и наоборот, любое число трактуется как ИСТИНА. Для лучшего понимания ниже приведен фрагмент кода:
if (bool_variable) printf("True!\n"); else printf("False!\n")
В C отсутствует понятие логического типа данных, вместо него используются числовые типы, в основном integer. Поэтому в логических операциях любой операнд числового типа, имеющий значение, не равное нулю, интерпретируется как ИСТИНА, а результатом логических операций являются целые числа, один и ноль соответственно. В C++ был введен логический тип данных, но скорее для удобства работы. Он никак не влияет на использование других типов в логических выражениях, как и в C.
Порядок выполнения операторов логических типов данных происходит слева направо. Например, вычисление выражения
var x && var y && var z
остановится, как только обнаружится первый операнд в значении ЛОЖЬ, а вычисление
var x || var y || var z
будет выполняться, пока компилятор не встретит первое истинное значение.
Паскаль
В разных языках программирования тонкости работы булевыми переменными могут немного отличатся. Логический тип данных в Паскале, например, имеет интересную особенность: здесь можно сравнивать ИСТИНУ и ЛОЖЬ, причем ЛОЖЬ меньше ИСТИНЫ. Также значению ЛОЖЬ соответствует ноль, а значению ИСТИНА - любое число, отличное от нуля.
Access
Логический тип данных в Access работает по сходным принципам.
- ЛОГИЧЕСКОЕ И And.
- ЛОГИЧЕСКОЕ ИЛИ Or.
- РАВЕНСТВО Eqv.
- НЕРАВЕНСТВО Not.
- ИСКЛЮЧАЮЩЕЕ ИЛИ Xor.
Выполняются они так же, как и в остальных популярных языках программирования.
Python
В языке Python логический тип данных объявляется стандартно — bool. Чтобы приводить иные типы к булеву типу, используется функция bool():
- Пустая строка — ЛОЖЬ, непустая — ИСТИНА.
- Ноль — ЛОЖЬ, любое число, отличное от нуля — ИСТИНА.
- Пустой массив — ЛОЖЬ, непустой — ИСТИНА.
- Функция — ИСТИНА.
Это все типы данных, к которым можно привести булев тип в Python.
Ruby
В значении ЛОЖЬ выступает nil, а ИСТИНОЙ может быть любой объект. Причем переменная со значением 0 или пустая строка тоже считается ИСТИНОЙ, и это может вызвать затруднения у людей, начинающих изучать этот язык.
Операции с логическими типами данных могут незначительно отличаться в зависимости от языка. Поэтому всегда необходимо знакомиться с тонкостями использования типов данных в изучаемом языке, чтобы не иметь трудностей в дальнейшем применении.