Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

typedef enum {FALSE = 0, TRUE} boolean;

Ответ 4

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

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

Ответ 5

В зависимости от того, с кем вы работаете, сравните свои переменные с ЛОЖЬЮ или ЛОЖЬЮ.

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

#define TRUE 1
#define FALSE 0

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

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

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

Ответ 10

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

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

Ответ 11

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

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

Конечно, более простой подход заключается в том, чтобы скомпилировать ваш C-код как С++.

Ответ 12

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

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

вместо:

if (variable)
{
   ...
}

Ответ 13

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

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

#define FALSE 0 
#define TRUE 1

и помните, что -1, -2,... 2, 3 и т.д. все оцениваются как true.

Ответ 14

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

#define FALSE = 0
#define TRUE = !FALSE

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

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

Ответ 15

Я предпочитаю использовать

#define FALSE (0!=0) 
#define TRUE  (0==0)

или прямо в коде

if (flag == (0==0)) { ... }

Об этом позаботится компилятор. Я использую много языков, и необходимость помнить, что FALSE = 0 меня очень беспокоит; но если мне нужно, я обычно думаю об этом цикле строки

do { ... } while (*ptr);

и это заставляет меня видеть, что ЛОЖЬ 0