Урок 3.1 — Логика и условия
Как компьютер принимает решения? От Булевой алгебры до логических значений true и false.
Каждый день ты принимаешь решения: «Если идёт дождь, возьми зонт», «Если кофе закончился, свари новый», «Если у меня есть 200 рублей, куплю пирожок». Компьютер делает то же самое, только миллиарды раз в секунду. Разница в том, что компьютер не думает — он строго следует логике, основанной на булевой алгебре. Этот урок — о том, как работают условия в программировании, и о человеке, который подарил нам эту логику.
Джордж Буль и рождение логики
Джордж Буль (George Boole, 1815–1864) — английский математик и философ. Он родился в бедной семье, не имел университетского образования (всё выучил сам), но стал профессором математики в Королевском колледже Корка, Ирландия.
В 1854 году он опубликовал книгу «Исследование законов мышления» (An Investigation of the Laws of Thought). В ней он показал, что логические рассуждения можно свести к простым математическим операциям. Это была революция: Буль доказал, что «истину» и «ложь» можно представить как числа 1 и 0, а логические рассуждения — как умножение и сложение.
Джордж Буль
1815 – 1864
«Законы мышления» → Булева алгебра → основа всех цифровых компьютеров
Сегодня булева алгебра — основа всех цифровых схем. Каждый транзистор в твоём процессоре — это физическая реализация булевой операции: AND, OR, NOT. Твоя программа компилируется в машинный код, который состоит из битов, и каждый бит — это 1 (истина) или 0 (ложь).
Без открытий Буля не было бы:
- 💻 Цифровых компьютеров (фон Нейман, Тьюринг — опирались на булеву алгебру)
- 📱 Смартфонов, интернета, Wi-Fi
- 🎮 Видеоигр, графики, GPU
- 🔐 Криптографии (шифрование основано на булевых операциях)
- 🧠 Искусственного интеллекта и логических сетей
bool flag = true;, ты отдаёшь дань уважения человеку, который доказал, что логика — это математика.Булева алгебра: три базовые операции
Булева алгебра оперирует только двумя значениями: Истина (True / 1) и Ложь (False / 0). Есть три базовые логические операции:
&&
Результат истинен только если оба операнда истинны. В быту: «если на улице дождь И есть зонт → я не промокну».
||
Результат истинен, если хотя бы один операнд истинен. В быту: «если у меня есть наличные ИЛИ карта → я могу заплатить».
!
Инвертирует значение. Истина → Ложь, Ложь → Истина. В быту: «НЕ идёт дождь → можно гулять».
💡 Мнемоническое правило для AND: представь строгую бабушку. Она разрешит тебе гулять только если ТЫ СДЕЛАЛ УРОКИ И убрался в комнате. Одно условие не выполнено — гулять не пойдёшь. Для OR: представь доброго папу. Он разрешит сок, если ТЫ ВЫПИЛ МОЛОКО ИЛИ съел суп. Достаточно одного.
Тип bool в C#: true и false
В C# за булевы значения отвечает тип bool. Он может принимать ровно два значения: true (истина) и false (ложь). Маленькие буквы важны: True (с большой) — это не C#.
bool isActive = true;
bool isDeleted = false;
bool isComplete = false;
Console.WriteLine(isActive); // True
Console.WriteLine(isDeleted); // False
// bool — это ответ на вопрос «да» или «нет»
bool isAdult = true; // совершеннолетний?
bool hasLicense = true; // есть права?
bool isOnline = false; // онлайн?
В отличие от C++, в C# bool нельзя преобразовать в int. true — это не 1, и false — не 0. Они отдельные значения:
bool flag = true;
// ❌ Нельзя записать bool в int:
// int x = flag; // CS0029: cannot implicitly convert 'bool' to 'int'
// ❌ Нельзя использовать число как условие:
// if (5) { } // CS0029: cannot implicitly convert 'int' to 'bool'
// ✅ Всегда нужно явное сравнение:
if (5 > 3) { } // OK — это выражение даёт bool
if 5: — и это сработает (5 — «truthy»). В C# так нельзя. Условие всегда должно быть bool-выражением. Это защищает от многих ошибок.Логические операторы: &&, ||, !
C# реализует булевы операции через специальные операторы:
| Оператор | Название | Пример | Результат |
|---|---|---|---|
&& | И (AND) — сокращённое | true && false | false |
|| | ИЛИ (OR) — сокращённое | true || false | true |
! | НЕ (NOT) | !true | false |
^ | ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) | true ^ false | true |
bool a = true;
bool b = false;
// AND — оба true
Console.WriteLine(a && a); // True
Console.WriteLine(a && b); // False
Console.WriteLine(b && b); // False
// OR — хотя бы один true
Console.WriteLine(a || a); // True
Console.WriteLine(a || b); // True
Console.WriteLine(b || b); // False
// NOT — отрицание
Console.WriteLine(!a); // False
Console.WriteLine(!b); // True
// XOR — только один true (но не оба)
Console.WriteLine(true ^ false); // True
Console.WriteLine(true ^ true); // False
Console.WriteLine(false ^ false); // False
⚠️ Сокращённое вычисление (short-circuit)
Операторы && и || — сокращённые. Это значит, что C# вычисляет только то, что необходимо. В A && B, если A = false — B даже не смотрит (потому что результат уже известен: false). В A || B, если A = true — B не вычисляется. Это важно, когда второе выражение может вызвать ошибку или побочный эффект.
// Безопасное обращение к объекту благодаря short-circuit:
string text = null;
// Если text == null, то text.Length НЕ вызывается (короткое замыкание)
if (text != null && text.Length > 5)
{
Console.WriteLine("Длинный текст");
}
else
{
Console.WriteLine("Текст null или короткий");
}
// → "Текст null или короткий"
// Если бы не short-circuit, text.Length выбросил бы NullReferenceException!
Операторы сравнения
Сравнения — это то, что превращает обычные числа и строки в булевы значения. Результат любого сравнения — bool.
| Оператор | Значение | Пример (x=5) |
|---|---|---|
== | Равно | x == 5 → true |
!= | Не равно | x != 3 → true |
> | Больше | x > 3 → true |
< | Меньше | x < 10 → true |
>= | Больше или равно | x >= 5 → true |
<= | Меньше или равно | x <= 5 → true |
int age = 25;
double temperature = 36.6;
string name = "Анна";
// Сравнение чисел
Console.WriteLine(age == 25); // True
Console.WriteLine(age != 18); // True
Console.WriteLine(age > 18); // True
Console.WriteLine(age < 18); // False
Console.WriteLine(age >= 25); // True
Console.WriteLine(temperature > 37); // False
// Сравнение строк
Console.WriteLine(name == "Анна"); // True
Console.WriteLine(name != "Иван"); // True
// Результат сравнения можно сохранить в bool:
bool isAdult = age >= 18; // true
bool isHot = temperature > 37.5; // false
bool isAdmin = name == "Админ"; // false
Console.WriteLine($"Взрослый: {isAdult}, Жарко ли: {isHot}, Админ: {isAdmin}");
== (два знака равно) — сравнение. = (один знак) — присваивание. Это одна из самых частых ошибок новичков. Запомни: сравниваешь — два знака, присваиваешь — один.Как компьютер принимает решения
В процессоре есть специальное устройство — ALU (Arithmetic Logic Unit, арифметико-логическое устройство). Оно выполняет две вещи: арифметику (+, -, *, /) и логические операции (&&, ||, !).
Когда программа доходит до строки if (age >= 18), происходит следующее:
- Процессор загружает значение переменной
ageиз памяти - ALU сравнивает его с 18 с помощью операции >=
- Результат (true/false) сохраняется как электрический сигнал: 1 (есть напряжение) или 0 (нет напряжения)
- Если сигнал 1 — процессор переходит к выполнению команд внутри блока if
- Если 0 — процессор перепрыгивает через блок if и выполняет следующую инструкцию
Схема: как процессор видит if
age = 25
↓
[ALU] age >= 18 ?
↓ ↓
true false
↓ ↓
[if body] [skip]
Console.Write ↓
("Взрослый") следующая
инструкция
Важно понимать: компьютер не «думает», не «сомневается», не «интерпретирует». Он просто сравнивает два значения и выдаёт 0 или 1. Это делает его бесконечно терпеливым и невероятно быстрым. Современные процессоры выполняют миллиарды таких сравнений в секунду.
💡 Это важно: Компьютер делает ровно то, что ты написал. Он не умеет догадываться. Если ты написал if (x = 5) вместо if (x == 5) — компьютер честно присвоит x значение 5 и пойдёт в тело if (потому что x стал 5, а 5 — это не false). Он не знает, что ты перепутал знаки.
Таблицы истинности
Таблица истинности — это полный перечень всех возможных комбинаций входных значений и соответствующих им результатов. Это фундаментальный инструмент булевой алгебры. Для двух переменных (A и B) возможно 4 комбинации. Для трёх — 8. Для N переменных — 2N.
Таблица AND (&&)
Истина только когда оба True
Таблица OR (||)
Истина когда хотя бы один True
⚠️ Законы де Моргана: два важных правила преобразования логических выражений:
!(A && B)==!A || !B(«не (A и B)» = «не A или не B»)!(A || B)==!A && !B(«не (A или B)» = «не A и не B»)
Всё вместе — логика в реальной программе
Программа проверки доступа к сайту. Используем все изученные концепции: bool, сравнения, логические операторы.
using System;
class Program
{
static void Main()
{
// Данные пользователя
int age = 20;
bool hasTicket = true;
bool isBanned = false;
bool hasParentalConsent = false;
// Условие доступа:
// Доступ разрешён, если (возраст >= 18 И есть билет)
// ИЛИ (возраст < 18 И есть согласие родителей)
// И пользователь не забанен.
bool canAccess = (age >= 18 && hasTicket) ||
(age < 18 && hasParentalConsent) &&
!isBanned;
Console.WriteLine($"Возраст: {age}");
Console.WriteLine($"Билет: {hasTicket}");
Console.WriteLine($"Забанен: {isBanned}");
Console.WriteLine($"Согласие родителей: {hasParentalConsent}");
Console.WriteLine($"{"=".PadRight(30, '=')}");
Console.WriteLine($"Доступ: {(canAccess ? "✅ Разрешён" : "❌ Запрещён")}");
// Альтернативная запись с if-else (мы изучим в следующем уроке):
if (canAccess)
Console.WriteLine("Добро пожаловать на сайт!");
else
Console.WriteLine("Доступ запрещён. Обратитесь в поддержку.");
}
}
canAccess читается как английское предложение: «can access?» — это понятнее, чем большая строка с && и ||.Что важно запомнить
&& (И), || (ИЛИ), ! (НЕ), ^ (XOR).==, !=, >, <, >=, <=. Результат — всегда bool.&& и || вычисляют только то, что нужно. Используй это для безопасных проверок.!(A && B) == !A || !B и !(A || B) == !A && !B.Тест: 3.1: Логика и условия
5 вопросов