Логические операции и операции отношения
Операции сравнения
Операции отношения сравнивают два значения и возвращают результат: истина (1) или ложь (0).
| Оператор | Значение | Пример | Результат |
|---|---|---|---|
== | Равно | 5 == 5 | 1 (истина) |
!= | Не равно | 5 != 3 | 1 (истина) |
> | Больше | 7 > 4 | 1 (истина) |
< | Меньше | 3 < 8 | 1 (истина) |
>= | Больше или равно | 5 >= 5 | 1 (истина) |
<= | Меньше или равно | 4 <= 6 | 1 (истина) |
Базовые примеры сравнения
#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
| A | B | A && B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
printf("0 && 0 = %d\n", 0 && 0); // 0
printf("0 && 1 = %d\n", 0 && 1); // 0
printf("1 && 0 = %d\n", 1 && 0); // 0
printf("1 && 1 = %d\n", 1 && 1); // 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;
}
Приоритет логических операций
- Отрицание
! - Операции отношения
< <= > >= == != - Логическое И
&& - Логическое ИЛИ
||
// Пример приоритета
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");
}
int isAdmin = 1;
int hasPermission = 0;
// Если isAdmin == 1, hasPermission не проверяется
if (isAdmin || hasPermission) {
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)поможет избежать ошибок присваивания - Читаемость важнее краткости
Логические операции позволяют создавать сложные условия для принятия решений в программах.