библиотека - тип boolean c




Использование булевых значений в C (9)

@Thomas Matthews: условные выражения считаются истинными, если они отличны от нуля, но для стандарта C требуется, чтобы сами логические операторы возвращали либо 0, либо 1.

@Tom: #define TRUE! FALSE плохой и совершенно бессмыслен. Если заголовочный файл входит в скомпилированный код на C ++, это может привести к проблемам:

void foo(bool flag);

...

int flag = TRUE;
foo(flag);

Некоторые компиляторы генерируют предупреждение о преобразовании int => bool. Иногда люди избегают этого, делая:

foo(flag == TRUE);

чтобы заставить выражение быть C ++ bool. Но если вы #define TRUE! FALSE, вы получите:

foo(flag == !0);

который заканчивается тем, что делает сравнение int-to-bool, которое может вызвать предупреждение в любом случае.

C не имеет встроенных булевых типов. Каков наилучший способ использовать их в C?


C имеет тип boolean: bool (по крайней мере, за последние 10 (!) Лет)

Включите stdbool.h и true / false будет работать, как ожидалось.


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

Псевдо-код

#define TRUE  1
#define FALSE 0

char bValue = TRUE;

Вы можете просто использовать директиву #define следующим образом:

#define TRUE 1
#define FALSE 0
#define NOT(arg) (arg == TRUE)? FALSE : TRUE
typedef int bool;

И используйте следующее:

bool isVisible = FALSE;
bool isWorking = TRUE;
isVisible = NOT(isVisible);

и так далее



Любое ненулевое значение вычисляется как true в булевых операциях, поэтому вы могли бы просто

#define TRUE 1
#define FALSE 0

и использовать константы.


Прежде всего. C, то есть ISO / IEC 9899 имеет булевский тип в течение 19 лет . Это путь больше времени, чем expected продолжительность карьеры программирования C с любительскими / академическими / профессиональными частями, объединенными при посещении этого вопроса . Мое превосходит это, возможно, 1-2 года. Однако в то время , когда средний читатель вообще узнал о C, C фактически имел тип булевых данных .

Для типа данных #include <stdbool.h> и используйте true , false и bool . Или не включайте его и вместо этого используйте ( _True , _False и ) _Bool .

В этой теме ответов есть различные опасные советы. Я обращусь к ним:

typedef int bool;
#define true 1
#define false 0

Это не-нет, потому что случайный читатель, который изучил C в течение этих 19 лет, ожидал бы, что bool ссылается на фактический тип данных bool и будет вести себя аналогичным образом, но это не так! Например

double a = ...;
bool b = a;

С C99 bool / _Bool b будет установлено значение false если a равно нулю, и true противном случае. При использовании typedef double будет принудительно привязан к int - если значение double не находится в диапазоне для int , поведение не определено .

Естественно, то же самое относится и к тому, что true и false были объявлены в enum .

Еще более опасным является объявление

typedef enum bool {
    false, true
} bool;

потому что теперь все значения, кроме 1 и 0, являются недопустимыми, и если такое значение будет присвоено переменной этого типа, поведение будет полностью неопределенным .

Поэтому, если вы не можете использовать C99 по какой-то необъяснимой причине, для булевых переменных вы должны использовать:

  • тип int и значения 0 и 1 as-is ; и тщательно делайте преобразования домена из любых других значений в них с двойным отрицанием !!
  • или если вы настаиваете , что не помните, что 0 является ложным и ненулевым, то, по крайней мере, используйте верхний регистр, чтобы они не путались с концепциями C99: BOOL , TRUE и FALSE !

Это так:

#define TRUE 1
#define FALSE 0

typedef enum {
    false = 0,
    true
} t_bool;






boolean