$ sudo teach IT
Модуль 3 · Условный оператор

Урок 3.1 — Логика и условия

Как компьютер принимает решения? От Булевой алгебры до логических значений true и false.

Каждый день ты принимаешь решения: «Если идёт дождь, возьми зонт», «Если кофе закончился, свари новый», «Если у меня есть 200 рублей, куплю пирожок». Компьютер делает то же самое, только миллиарды раз в секунду. Разница в том, что компьютер не думает — он строго следует логике, основанной на булевой алгебре. Этот урок — о том, как работают условия в программировании, и о человеке, который подарил нам эту логику.

👤

Джордж Буль и рождение логики

Джордж Буль (George Boole, 1815–1864) — английский математик и философ. Он родился в бедной семье, не имел университетского образования (всё выучил сам), но стал профессором математики в Королевском колледже Корка, Ирландия.

В 1854 году он опубликовал книгу «Исследование законов мышления» (An Investigation of the Laws of Thought). В ней он показал, что логические рассуждения можно свести к простым математическим операциям. Это была революция: Буль доказал, что «истину» и «ложь» можно представить как числа 1 и 0, а логические рассуждения — как умножение и сложение.

GB

Джордж Буль

1815 – 1864

«Законы мышления» → Булева алгебра → основа всех цифровых компьютеров

Сегодня булева алгебра — основа всех цифровых схем. Каждый транзистор в твоём процессоре — это физическая реализация булевой операции: AND, OR, NOT. Твоя программа компилируется в машинный код, который состоит из битов, и каждый бит — это 1 (истина) или 0 (ложь).

Без открытий Буля не было бы:

  • 💻 Цифровых компьютеров (фон Нейман, Тьюринг — опирались на булеву алгебру)
  • 📱 Смартфонов, интернета, Wi-Fi
  • 🎮 Видеоигр, графики, GPU
  • 🔐 Криптографии (шифрование основано на булевых операциях)
  • 🧠 Искусственного интеллекта и логических сетей
💡 В честь Буля назван тип данных bool в C# (и boolean в Java, JavaScript, Python). Каждый раз, когда ты пишешь bool flag = true;, ты отдаёшь дань уважения человеку, который доказал, что логика — это математика.
🧮

Булева алгебра: три базовые операции

Булева алгебра оперирует только двумя значениями: Истина (True / 1) и Ложь (False / 0). Есть три базовые логические операции:

∧
AND (Конъюнкция / «И») C#: &&

Результат истинен только если оба операнда истинны. В быту: «если на улице дождь И есть зонт → я не промокну».

A
B
A AND B
False
False
False
False
True
False
True
False
False
True
True
True
∨
OR (Дизъюнкция / «ИЛИ») C#: ||

Результат истинен, если хотя бы один операнд истинен. В быту: «если у меня есть наличные ИЛИ карта → я могу заплатить».

A
B
A OR B
False
False
False
False
True
True
True
False
True
True
True
True
¬
NOT (Отрицание / «НЕ») C#: !

Инвертирует значение. Истина → Ложь, Ложь → Истина. В быту: «НЕ идёт дождь → можно гулять».

A
NOT A
False
True
True
False

💡 Мнемоническое правило для AND: представь строгую бабушку. Она разрешит тебе гулять только если ТЫ СДЕЛАЛ УРОКИ И убрался в комнате. Одно условие не выполнено — гулять не пойдёшь. Для OR: представь доброго папу. Он разрешит сок, если ТЫ ВЫПИЛ МОЛОКО ИЛИ съел суп. Достаточно одного.

🔲

Тип bool в C#: true и false

В C# за булевы значения отвечает тип bool. Он может принимать ровно два значения: true (истина) и false (ложь). Маленькие буквы важны: True (с большой) — это не C#.

C# · Тип bool
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. Они отдельные значения:

C# · bool — строгий тип
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
💡 В Python можно написать if 5: — и это сработает (5 — «truthy»). В C# так нельзя. Условие всегда должно быть bool-выражением. Это защищает от многих ошибок.
🔣

Логические операторы: &&, ||, !

C# реализует булевы операции через специальные операторы:

Оператор Название Пример Результат
&&И (AND) — сокращённоеtrue && falsefalse
||ИЛИ (OR) — сокращённоеtrue || falsetrue
!НЕ (NOT)!truefalse
^ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)true ^ falsetrue
C# · Логические операторы
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 не вычисляется. Это важно, когда второе выражение может вызвать ошибку или побочный эффект.

C# · Short-circuit пример
// Безопасное обращение к объекту благодаря 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
C# · Операторы сравнения
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), происходит следующее:

  1. Процессор загружает значение переменной age из памяти
  2. ALU сравнивает его с 18 с помощью операции >=
  3. Результат (true/false) сохраняется как электрический сигнал: 1 (есть напряжение) или 0 (нет напряжения)
  4. Если сигнал 1 — процессор переходит к выполнению команд внутри блока if
  5. Если 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 (&&)

A
B
A && B
F
F
F
F
T
F
T
F
F
T
T
T

Истина только когда оба True

Таблица OR (||)

A
B
A || B
F
F
F
F
T
T
T
F
T
T
T
T

Истина когда хотя бы один True

⚠️ Законы де Моргана: два важных правила преобразования логических выражений:

  • !(A && B) == !A || !B («не (A и B)» = «не A или не B»)
  • !(A || B) == !A && !B («не (A или B)» = «не A и не B»)
🧩

Всё вместе — логика в реальной программе

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

C# · Проверка доступа
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?» — это понятнее, чем большая строка с && и ||.
📌

Что важно запомнить

1️⃣
Джордж Буль — отец булевой алгебры. Его открытия — основа всех цифровых компьютеров.
2️⃣
Тип bool — только true и false. В C# нельзя использовать числа как bool (строгая типизация).
3️⃣
Логические операторы: && (И), || (ИЛИ), ! (НЕ), ^ (XOR).
4️⃣
Операторы сравнения: ==, !=, >, <, >=, <=. Результат — всегда bool.
5️⃣
Short-circuit: && и || вычисляют только то, что нужно. Используй это для безопасных проверок.
6️⃣
Таблицы истинности — полное описание всех комбинаций. Для N переменных — 2N строк.
7️⃣
Законы де Моргана: !(A && B) == !A || !B и !(A || B) == !A && !B.

Тест: 3.1: Логика и условия

5 вопросов

Сравнение чисел

Premium