Elementor Header #8

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

1. Введение

В этом уроке мы продолжим изучение логических операторов в C++. Мы рассмотрим более сложные примеры их использования, а также типичные ошибки, которые могут возникнуть при комбинировании логических операторов и создании сложных условий. Этот урок строится на знаниях, полученных в предыдущих уроках о логических операторах и отрицании.

2. Логические операторы в сложных условиях

Логические операторы && (логическое И) и || (логическое ИЛИ) можно комбинировать для создания сложных условий. Очень важно правильно управлять порядком выполнения операций и корректно использовать скобки для группировки условий.

Пример:
				
					#include <iostream>

int main() {
    int a = 10;
    int b = 20;
    int c = -5;

    if ((a > 0 && b > 0) || c > 0) {
        std::cout << "Либо оба числа a и b положительные, либо c положительное." << std::endl;
    } else {
        std::cout << "Ни одно из условий не выполнено." << std::endl;
    }

    return 0;
}

				
			

В этом примере выражение (a > 0 && b > 0) || c > 0 проверяет, выполняются ли два условия одновременно (оба числа a и b положительные) или хотя бы одно условие (число c положительное). Если хотя бы одно из этих условий истинно, будет выполнен первый блок if.

3. Приоритет логических операторов

Логические операторы имеют определённый приоритет при выполнении. Оператор && имеет более высокий приоритет, чем ||. Это означает, что выражения с && будут выполнены раньше, чем выражения с ||, если не использовать скобки.

Пример:
				
					#include <iostream>

int main() {
    int a = 5;
    int b = 10;
    int c = 15;

    if (a > 0 && b < 20 || c < 10) {
        std::cout << "Условие выполнено." << std::endl;
    } else {
        std::cout << "Условие не выполнено." << std::endl;
    }

    return 0;
}

				
			

В этом примере сначала выполняется условие a > 0 && b < 20, а затем результат сравнивается с c < 10 через оператор ||. Чтобы изменить приоритет выполнения, можно использовать скобки:

				
					if (a > 0 && (b < 20 || c < 10)) {
    // ...
}

				
			

Теперь сначала будет выполнено выражение (b < 20 || c < 10).

4. Короткое замыкание (Short-Circuit)

Как уже упоминалось в предыдущем уроке, логические операторы && и || поддерживают короткое замыкание. Это означает, что если результат выражения можно определить на основе первой части, вторая часть не будет вычисляться.

Пример:
				
					#include <iostream>

bool checkPositive(int n) {
    std::cout << "Проверка числа: " << n << std::endl;
    return n > 0;
}

int main() {
    int number = -10;

    if (number > 0 && checkPositive(number)) {
        std::cout << "Число положительное и прошло проверку." << std::endl;
    } else {
        std::cout << "Число не прошло проверку." << std::endl;
    }

    return 0;
}

				
			

В этом коде функция checkPositive() не будет вызвана, если number > 0 ложное, потому что результат всей операции && уже известен (ложный).

5. Распространённые ошибки при использовании логических операторов

Ошибки с приоритетом операций:

				
					if (a > 0 && b > 0 || c > 0) {
    // Это выражение может не работать так, как вы ожидаете, из-за приоритета операторов.
}

				
			

Решение: Используйте скобки, чтобы явно указать порядок выполнения операций.

				
					if ((a > 0 && b > 0) || c > 0) {
    // Теперь логика более предсказуема.
}

				
			

Ошибки из-за короткого замыкания:

				
					if (a != 0 && b / a > 2) {
    // Если a равно 0, произойдет деление на ноль, что вызовет ошибку.
}

				
			

Решение: Всегда проверяйте, что переменные находятся в безопасных для вычисления значениях, прежде чем использовать их в выражениях.

				
					if (a != 0 && (b / a) > 2) {
    // Убедитесь, что деление на ноль невозможно.
}

				
			

Ошибка из-за неверного комбинирования логических операторов:

				
					bool isActive = true;
bool isVerified = false;

if (!isActive || isVerified) {
    // Здесь ошибка логики: условие выполнится, даже если isActive ложное.
}

				
			

Решение: Проверьте, что условия корректно отражают логику вашей программы.

				
					if (!(isActive && isVerified)) {
    // Условие будет истинным, если одно из значений ложно.
}

				
			

Заключение

Логические операторы в C++ — это мощный инструмент для управления условиями в программах. Правильное использование этих операторов, понимание их приоритета и знание особенностей короткого замыкания помогут вам писать более точный и надёжный код. Важно уделять внимание скобкам и порядку операций, чтобы избежать ошибок, связанных с некорректным комбинированием условий.

6. Тестовое задание

Напишите программу на C++, которая:

  1. Запрашивает у пользователя три числа.
  2. Проверяет следующие условия:
    • Все три числа положительные.
    • Хотя бы одно из чисел отрицательное.
    • Первое число положительное, а два других отрицательные.
  3. Выводит соответствующие сообщения в зависимости от выполнения условий.

Примерный код:

				
					#include <iostream>

int main() {
    int a, b, c;

    std::cout << "Введите три числа: ";
    std::cin >> a >> b >> c;

    if (a > 0 && b > 0 && c > 0) {
        std::cout << "Все числа положительные." << std::endl;
    } else if (a < 0 || b < 0 || c < 0) {
        std::cout << "Хотя бы одно из чисел отрицательное." << std::endl;
    }

    if (a > 0 && b < 0 && c < 0) {
        std::cout << "Первое число положительное, а два других отрицательные." << std::endl;
    }

    return 0;
}

				
			

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

logo