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


насколько я вижу, есть 3 способа использовать булевы в c

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

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

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

14 53

14 ответов:

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

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

для программистов C это так же интуитивно, как true или false.

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

typedef enum {FALSE = 0, TRUE} boolean;

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

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

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

#ifndef __bool_true_false_are_defined || __bool_true_false_are_defined == 0
//typedef or define here
#endif

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

Я предпочитаю (1), Когда я определяю переменную, но в выражениях Я никогда не сравниваю с true и false, просто возьмите неявное определение c if(флаг) или if(!флаг) или если(ptr). Это C способ делать вещи.

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

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

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

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

какой бы из трех вы идете с, сравнить ваши переменные против FALSE, или false.

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

#определить TRUE 1
#определить FALSE 0

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

Я не знаю конкретной ситуации. Когда я писал программы на C, мы всегда использовали #2.

#define FALSE = 0
#define TRUE = !FALSE

это может быть иначе под чужой платформой для DOS или процессоров на базе Intel. Но я использовал как C, так и ASM вместе для написания графических библиотек и графической IDE. Я был истинным поклонником Micheal Abrash и намеревался узнать о сопоставлении текстур и так далее. В любом случае! Это не предмет вопроса здесь!

Это было самое обычно используется форма для определения логических значений в C, как это headerfile stdbool.h тогда не существовало.

нет никакой реальной разницы в скорости. Они все одинаковы для компилятора. Разница заключается в том, что люди пытаются использовать и читать ваш код.

для меня это делает bool, true и false лучшим выбором в коде C++. В коде C есть некоторые компиляторы, которые не поддерживают bool (мне часто приходится работать со старыми системами), поэтому я могу пойти с определениями в некоторых обстоятельствах.

1 является наиболее читаемым, не совместимые со всеми компиляторами.

ни один компилятор ISO C не имеет встроенного типа под названием bool. Компиляторы ISO C99 имеют тип _Bool, и заголовок, который состоит в bool. Таким образом, совместимость-это просто случай предоставления собственного заголовка, если компилятор не совместим с C99 (например, VC++).

конечно, более простой подход заключается в компиляции кода C как C++.

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

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

вместо:

if (variable)
{
   ...
}

я использовал #define, потому что они облегчают чтение кода, и не должно быть ухудшения производительности по сравнению с использованием чисел (0,1), потому что препроцессор преобразует #define в числа перед компиляцией. После того, как приложение запускается препроцессор не приходит в путь снова, потому что код уже скомпилирован.

кстати это должно быть:

#define FALSE 0 
#define TRUE 1

и помните, что -1, -2, ... 2, 3 и т. д. все имеет значение true.