Стандартная библиотека C<stdbool.h>

До стандарта C99 целочисленные типы (такие какint)для представления логических значений. Например,0обозначает false, ненулевые значения (обычно1) обычно использовались в C для представления true. Этот подход, хотя и был возможен, не обладал интуитивностью и типобезопасностью. Чтобы решить эту проблему, стандарт C99 ввёлstdbool.hзаголовочный файл, который определяет логический тип и связанные макросы.

<stdbool.h>— стандартный заголовочный файл в C, который определяет булев тип и связанные с ним константы. Он делает булев тип в C (bool) стал более явным и удобным, позволяя избежать традиционной практики использования целых чисел (например, 0 или 1) для представления булевых значений.

stdbool.hЗаголовочный файл определяет следующее:

  • bool: булев тип, используемый для объявления булевых переменных.
  • true:макрос, представляющий истинное значение, обычно определяемый как1。
  • false:макрос, представляющий ложное значение, обычно определяемый как0。
  • __bool_true_false_are_defined:макрос, используемый для указанияtrueиfalseопределено ли оно.

Эти макросы определяются следующим образом:

#define bool _Bool
#define true 1
#define false 0
#define __bool_true_false_are_defined 1

bool является псевдонимом для типа _Bool.

_Bool — это встроенный тип, введённый в стандарте C99, представляющий булево значение. Тип _Bool может хранить только 0 или 1, что делает его подходящим для хранения логических значений.

#include <stdbool.h>

_Bool is_valid = 1;  // 也可以直接使用 _Bool 类型

Чтобы использовать булев тип и связанные макросы в программе на C, сначала нужно подключить<stdbool.h>Заголовочный файл:

#include <stdbool.h>

bool is_raining = true;
bool is_sunny = false;

Пример

Ниже приведён пример использования<stdbool.h>простой пример:

Пример

#include <stdio.h>
#include <stdbool.h>

int main() {
    // Объявление логической переменной
    bool isReady = true;
    bool isFinished = false;

    // Использование логической переменной
    if (isReady) {
        printf("Система готова.\n");
    } else {
        printf("Система не готова.\n");
    }

    if (!isFinished) {
        printf("Задача не завершена.\n");
    }

    // Значение логической переменной
    printf("isReady: %d\n", isReady);       // Вывод 1 (true)
    printf("isFinished: %d\n", isFinished); // Вывод 0 (false)

    return 0;
}

Результат вывода:

The system is ready.
The task is not finished.
isReady: 1
isFinished: 0

Тип bool

Определите логические переменные с помощью типа bool:

Пример

#include <stdio.h>
#include <stdbool.h>

int main() {
    bool flag = true;  // Использовать тип bool

    if (flag) {
        printf("Флаг истинен.\n");
    } else {
        printf("Флаг ложен.\n");
    }

    return 0;
}

В приведённом выше примере flag — логическая переменная с начальным значением true. Проверьте, равно ли flag значению true, затем выведите соответствующее сообщение.

Макросы true и false

true и false — предопределённые макросы, соответствующие логическим значениям 1 и 0 соответственно, и их можно использовать напрямую в условиях:

Пример

#include <stdio.h>
#include <stdbool.h>

int main() {
    bool is_logged_in = false;

    // Изменить логическое значение
    if (!is_logged_in) {
        is_logged_in = true;
        printf("Пользователь вошёл в систему: %s\n", is_logged_in ? "true" : "false");
    }

    return 0;
}
В этом коде is_logged_in изначально false, а затем в логике изменяется на true.

Используется в сочетании с такими операторами, как if и while

Логические типы полезны в управляющих структурах, таких как if, while и for:

Пример

#include <stdio.h>
#include <stdbool.h>

int main() {
    bool condition = false;

    while (!condition) {
        printf("Условие ложно.\n");
        condition = true;  // Изменить condition на true
    }

    return 0;
}

Здесь цикл while будет продолжать выполняться, пока condition не станет true.

Совместимость между логическим типом и целыми числами

Хотя сам тип bool является отдельным типом, на уровне внутренней реализации он обычно опирается на целочисленный тип (обычно int). Поэтому true можно считать равным 1, а false — 0.

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

Пример

#include <stdio.h>
#include <stdbool.h>

int main() {
    bool is_active = true;

    // Неправильный подход: смешивание логических значений с целыми числами
    int status = is_active;  // Эта строка компилируется нормально, но её лучше избегать.

    if (status) {
        printf("Статус истинен.\n");
    } else {
        printf("Статус ложен.\n");
    }

    return 0;
}

Хотя приведённый выше код выполняется корректно, так делать не рекомендуется, потому что он смешивает логические значения и целочисленные типы, что затрудняет понимание кода.

Преимущества логического типа

  • Читаемость: ИспользованиеboolТип делает намерение программы более ясным по сравнению с использованиемintТип представляет true или false,boolТип может явно указывать, что переменная используется только для представления булева значения.
  • Стандартизация:<stdbool.h>Он предоставляет стандартный способ обработки булевых значений, избегая сложности использования макросов или целочисленных типов для представления булевых значений.
  • Безопасность типов: сintТип отличается,boolТип специально используется для логических проверок, уменьшая проблемы несоответствия типов.
Другие расширения