Может ли переменная bool быть NULL?
Я хочу знать, может ли переменная bool быть NULL или она должна быть истинной или ложной:
База на Arduino описание: Bool содержит одно из двух значений, true или false. (Каждая переменная bool занимает один байт памяти.)
@Shahreza, 👍1
2 ответа
Bool - это буквально то, что- логическое значение. Так что либо 1, либо 0 - истинно или ложно.
В языке C только указатели могут быть пустыми. Каждый другой примитивный тип является значением, а NULL не является значением.
Значение 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.
- Как объявить массив переменного размера (глобально)
- Как получить тип данных переменной?
- Преобразование long в массив символов и обратно
- контент» не захватывается
- Получение имени перечисления из экземпляра перечисления
- Некоторые переменные не сохраняют свои значения при выходе из цикла while?
- Как отобразить переменные с плавающей запятой на OLED-дисплее (0,96 дюйма)
- Сохранение файла .txt на SD-карту и чтение данных каждого содержимого в файл txt, а затем сохранение его в переменной
просто хочу знать, прав я или нет, что 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