Использование true и false в C - PullRequest
       72

Использование true и false в C

57 голосов
/ 12 февраля 2010

Насколько я вижу, в c

есть 3 способа использования логических значений.
  1. с типом bool, с последующим использованием true и false
  2. определение с использованием препроцессора #define FALSE 0 ... #define TRUE !(FALSE)
  3. Просто для непосредственного использования констант, то есть 1 и 0

Есть ли другие способы, которые я пропустил? Каковы плюсы и минусы разных методов?

Полагаю, самым быстрым будет номер 3, 2 еще легче читается (хотя побитовое отрицание немного увеличит накладные расходы), 1 наиболее читабельно не совместимо со всеми компиляторами.

Ответы [ 15 ]

93 голосов
/ 12 февраля 2010

Просто включите <stdbool.h>, если ваша система предоставляет его. Это определяет количество макросов, включая bool, false и true (определенные для _Bool, 0 и 1 соответственно). См. Раздел 7.16 C99 для более подробной информации.

18 голосов
/ 12 февраля 2010

Просто используйте 0 или 1 непосредственно в коде.

Для программистов на Си это так же интуитивно, как истина или ложь.

14 голосов
/ 12 февраля 2010

Я обычно делаю:

typedef enum {FALSE = 0, TRUE} boolean;
4 голосов
/ 05 августа 2012

В зависимости от того, с кем вы работаете, сравните свои переменные с FALSE или false.

Исторически было бы плохой идеей сравнивать что-либо с истинным (1) в c или c ++,Только ложь гарантированно равна нулю (0).Истина любое другое значение .Многие производители компиляторов имеют эти определения где-то в своих заголовках.

# определить ИСТИНА 1
# определить ЛОЖЬ 0

Это привело слишком много людей к дорожке в саду.Многие библиотечные функции, кроме chartype, возвращают ненулевые значения, не равные 1 в случае успеха.Существует множество устаревших кодов с таким же поведением.

4 голосов
/ 12 февраля 2010

С определенным типом bool stdbool.h возникают проблемы, когда вам нужно переместить код из более нового компилятора, который поддерживает тип bool, в более старый компилятор. Это может произойти во встроенной среде программирования при переходе на новую архитектуру с компилятором C, основанным на более старой версии спецификации.

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

3 голосов
/ 12 февраля 2010

Вы можете проверить, определен ли bool в c99 stdbool.h с помощью

#ifndef __bool_true_false_are_defined || __bool_true_false_are_defined == 0
//typedef or define here
#endif
2 голосов
/ 12 февраля 2010

Любой int, отличный от нуля, имеет значение true; ложь это ноль. Таким образом, код, подобный этому, продолжает работать, как и ожидалось:

int done = 0;   // `int` could be `bool` just as well

while (!done)
{
     // ...
     done = OS_SUCCESS_CODE == some_system_call ();
}

IMO, bool - переоцененный тип, возможно перенесенный с других языков. int отлично работает как логический тип.

2 голосов
/ 12 февраля 2010

Я предпочитаю (1), когда я определяю переменную, но в выражениях я никогда не сравниваю с истиной и ложью, просто беру неявное определение C if (flag) или if (! Flag) или if (ptr) Вот С способ делать вещи.

2 голосов
/ 12 февраля 2010

Я бы пошел на 1. Я не встречал несовместимости с ним и является более естественным. Но я думаю, что это часть C ++, а не стандарта C. Я думаю, что при грязном хакерстве с использованием определений или вашего третьего варианта - производительность не увеличится, а только поддержит код.

1 голос
/ 13 февраля 2010

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

if (variable == TRUE)
{
   ...
}

вместо:

if (variable)
{
   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...