Перейти к основному содержимому

Логические операции и операции отношения

Операции сравнения

Операции отношения сравнивают два значения и возвращают результат: истина (1) или ложь (0).

ОператорЗначениеПримерРезультат
==Равно5 == 51 (истина)
!=Не равно5 != 31 (истина)
>Больше7 > 41 (истина)
<Меньше3 < 81 (истина)
>=Больше или равно5 >= 51 (истина)
<=Меньше или равно4 <= 61 (истина)

Базовые примеры сравнения

#include <stdio.h>

int main() {
int age = 20;
int limit = 18;

printf("Возраст: %d, лимит: %d\n", age, limit);
printf("age > limit: %d\n", age > limit); // 1
printf("age == limit: %d\n", age == limit); // 0
printf("age <= limit: %d\n", age <= limit); // 0

return 0;
}

Логические операторы

Комбинируют несколько условий в одно.

ОператорНазваниеОписаниеПример
&&И (AND)Истина, если оба условия истинныa > 0 && b > 0
||ИЛИ (OR)Истина, если хотя бы одно условие истинноx == 1 || x == 2
!НЕ (NOT)Инвертирует логическое значение!isActive

Логическое И (&&)

int age = 25;
int hasLicense = 1; // 1 = true, 0 = false

// Оба условия должны быть истинными
if (age >= 18 && hasLicense) {
printf("Можно водить автомобиль\n");
}

printf("age >= 18: %d\n", age >= 18); // 1
printf("hasLicense: %d\n", hasLicense); // 1
printf("Результат &&: %d\n", age >= 18 && hasLicense); // 1

Логическое ИЛИ (||)

int dayOfWeek = 6;  // Суббота

// Выходной день: суббота (6) или воскресенье (7)
if (dayOfWeek == 6 || dayOfWeek == 7) {
printf("Сегодня выходной!\n");
}

// Таблица истинности для ||
printf("0 || 0 = %d\n", 0 || 0); // 0
printf("0 || 1 = %d\n", 0 || 1); // 1
printf("1 || 0 = %d\n", 1 || 0); // 1
printf("1 || 1 = %d\n", 1 || 1); // 1

Логическое НЕ (!)

int isLoggedIn = 0;  // Не авторизован

if (!isLoggedIn) {
printf("Пожалуйста, войдите в систему\n");
}

printf("isLoggedIn: %d\n", isLoggedIn); // 0
printf("!isLoggedIn: %d\n", !isLoggedIn); // 1
printf("!!isLoggedIn: %d\n", !!isLoggedIn); // 0 (двойное отрицание)

Комбинирование операций

Сложные условия

#include <stdio.h>

int main() {
int temperature = 22;
int humidity = 60;
int isSunny = 1;

// Хорошая погода: тепло И не слишком влажно И солнечно
int goodWeather = (temperature >= 20 && temperature <= 30) &&
humidity < 70 &&
isSunny;

printf("Температура: %d°C\n", temperature);
printf("Влажность: %d%%\n", humidity);
printf("Солнечно: %s\n", isSunny ? "Да" : "Нет");
printf("Хорошая погода: %s\n", goodWeather ? "Да" : "Нет");

return 0;
}

Приоритет логических операций

  1. Отрицание !
  2. Операции отношения < <= > >= == !=
  3. Логическое И &&
  4. Логическое ИЛИ ||
// Пример приоритета
int a = 5, b = 3, c = 8;

int result1 = a > b && c > a; // (5 > 3) && (8 > 5) = 1 && 1 = 1
int result2 = a > b || c < a && b > c; // (5 > 3) || ((8 < 5) && (3 > 8)) = 1 || (0 && 0) = 1 || 0 = 1
int result3 = !(a == b); // !(5 == 3) = !0 = 1

printf("Результат 1: %d\n", result1);
printf("Результат 2: %d\n", result2);
printf("Результат 3: %d\n", result3);

Короткие вычисления

int x = 0;
int y = 5;

// Если x == 0, второе условие не проверяется
if (x != 0 && y / x > 2) {
printf("Условие выполнено\n");
} else {
printf("Деление на ноль предотвращено\n");
}
Важная особенность

В операциях && и || правое условие проверяется только если это необходимо. Это называется "короткое вычисление" или "ленивое вычисление".

Практические примеры

Проверка диапазона

#include <stdio.h>

int main() {
int score = 85;

// Проверка оценки
if (score >= 90) {
printf("Отлично!\n");
} else if (score >= 80 && score < 90) {
printf("Хорошо!\n");
} else if (score >= 70 && score < 80) {
printf("Удовлетворительно\n");
} else {
printf("Нужно улучшить результат\n");
}

return 0;
}

Валидация данных

#include <stdio.h>

int main() {
int age = 16;
char category = 'S'; // S = студент, W = работающий

// Проверка права на скидку
int hasDiscount = (age < 18) || // Несовершеннолетний
(age >= 65) || // Пенсионер
(category == 'S'); // Студент

printf("Возраст: %d\n", age);
printf("Категория: %c\n", category);
printf("Право на скидку: %s\n", hasDiscount ? "Есть" : "Нет");

if (hasDiscount) {
printf("Скидка 15%% применена!\n");
}

return 0;
}

Частые ошибки

Типичные проблемы
// ❌ Путаница = и ==
int x = 5;
if (x = 10) { // Присваивание вместо сравнения!
printf("Всегда выполнится\n");
}

// ✅ Правильно
if (x == 10) { // Сравнение
printf("x равно 10\n");
}

// ❌ Неправильная проверка диапазона
if (10 < x < 20) { // Не работает как ожидается!

// ✅ Правильно
if (x > 10 && x < 20) {
Советы по стилю
  • Используйте скобки для ясности: (a > 0) && (b < 10)
  • Сравнивайте константы слева: if (5 == x) поможет избежать ошибок присваивания
  • Читаемость важнее краткости

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