Может ли переменная bool быть NULL?

Я хочу знать, может ли переменная bool быть NULL или она должна быть истинной или ложной:

База на Arduino описание: Bool содержит одно из двух значений, true или false. (Каждая переменная bool занимает один байт памяти.)

, 👍1


2 ответа


1

Bool - это буквально то, что- логическое значение. Так что либо 1, либо 0 - истинно или ложно.

В языке C только указатели могут быть пустыми. Каждый другой примитивный тип является значением, а NULL не является значением.

,

2

Значение bool должно быть либо 0, либо 1, либо false и true соответственно. Это неопределенное поведение для любого другого значения. При присвоении значения boolкомпилятор автоматически принудительно присвоит ему значение 0, если оно уже равно 0, или 1, если это не так.

Однако, поскольку это полный байт, можно сохранить другое значение. Однако, как упоминалось ранее, это неопределенное поведение. Это означает, что если это когда-либо произойдет или обязательно произойдет, программа может сделать что угодно: например, аварийно завершить работу программы, вывести случайные данные или действовать так, как будто это правда, ложь или то и другое вместе! На самом деле, это может (опять же, без гарантий) произойти, если вы сохраните значение 2:

#include <cstdio>

int main() {
    union b_c {
        unsigned char c;
        bool b;
    };
    b_c c;
    c.c = 2;

    if(c.b) puts("true!");
    if(!c.b) puts("false!");
}

(это предназначено для работы на компьютере, но то же самое может произойти и на Arduino). Проверьте, что происходит, когда вы запускаете его: он выводит оба значения true! и ложь!! Это, очевидно, не имеет смысла, но поскольку мы нарушаем правила, делая bool 2, мы теряем все гарантии.


Итак, какое это имеет отношение к вашему вопросу? Нет никакого допустимого значения, которое bool может хранить, кроме true и false. В C++ значение null определяется как "целочисленный литерал со значением ноль". Таким образом, если бы вы назначили bool значение null, оно было бы сохранено как ложное. Если вам нужно отдельное нулевое значение, вам лучше использовать другой тип, который занимает один байт (например unsigned char или uint8_t, то же самое), и хранить, например, 0 для false, 1 для trueи 2 для null.

,

просто хочу знать, прав я или нет, что bool-это один бит, который может содержать только 0 или 1, @Shahreza

@Shahreza да, вы можете хранить только "0 или 1` в "bool", то есть один бит. Однако, поскольку вы не можете адресовать отдельные биты, каждый "bool" занимает полный байт, даже если вы не можете использовать остальные 7 "но"., @lights0123

В зависимости от реализации компилятора, bool также может быть таким же широким, как int. Нет никакой гарантии, что он занимает всего 8 бит (глава 8.3.3 стандарта C++17). Однако некоторые системы поддерживают битовый доступ (например, микроконтроллер 8051), а некоторые компиляторы для них поддерживают 1-битный bool., @the busybee

Логический тест не смотрит только на бит 0 *в большинстве реализаций*; скорее, он может смотреть на всю переменную и проверять ее "нулевую". Ноль == ложь; ненулевое значение == истина. Это все равно не оставляет никаких значений для третьего отдельного значения (например, NULL). Если вам это нужно, перечисление было бы лучшим выбором., @JRobert