Использование логических значений в C

Мое предпочтение заключается в том, чтобы установить их непосредственно в конструкторе по нескольким причинам. Во-первых, что-то вроде this.x = x; так же ясно, если не больше, чем вызов отдельного метода, который делает то же самое. Во-вторых, метод может быть потенциально переопределен, если он не будет помечен как окончательный, а вызов потенциально переопределенных методов из конструктора - это большое значение no-no в моей книге. В-третьих, большинство методов обычно предполагают, что объект уже завершен, когда они выполняются, а не на полпути к его построению. Хотя это не должно вызывать каких-либо проблем в этом простом случае, в более сложных случаях это может вызвать серьезные тонкие ошибки, требующие возраста для отслеживания.

Основной аргумент в пользу использования сеттеров / геттеров во всем мире состоит в том, что это означает вы можете переименовать поле, просто изменив его имя в 3-х местах, его определение, методы getter / setter, и все должно компилироваться и быть в порядке. На мой взгляд, этот аргумент недействителен в наши дни, поскольку любая достойная современная среда IDE переименует все вхождения такого поля с помощью простого сочетания клавиш.

631
задан Peter Mortensen 18 May 2016 в 22:54
поделиться

11 ответов

От лучшего к худшему:

Вариант 1 (C99)

#include <stdbool.h>

Вариант 2

typedef enum { false, true } bool;

Вариант 3

typedef int bool;
enum { false, true };

Вариант 4

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

Пояснение

  • Вариант 1 будет работать только если вы используете C99 и это «стандартный способ». Если возможно, выберите это.
  • Варианты 2, 3 и 4 на практике будут вести себя одинаково. # 2 и # 3 не используют #defines, что, на мой взгляд, лучше.

Если вы не определились, выберите # 1!

991
ответ дан 22 November 2019 в 21:47
поделиться

Если Ваше использование c99 Вы может использовать тип _Book, который является частью c99, Т.е. никакие #includes' не необходимы. Действительно необходимо рассматривать его как интервал хотя, где 1 = верный и 0 = ложь. Можно затем определить ИСТИНУ И ЛОЖЬ.

_Bool this_is_a_Boolean_var = 1;


//or using it with true and false
#define TRUE 1
#define FALSE 0
_Book var = TRUE;
1
ответ дан 22 November 2019 в 21:47
поделиться

Для этого можно использовать символ или другой контейнер с маленькими числами.

Псевдокод

#define TRUE  1
#define FALSE 0

char bValue = TRUE;
1
ответ дан 22 November 2019 в 21:47
поделиться

Это:

#define TRUE 1
#define FALSE 0
1
ответ дан 22 November 2019 в 21:47
поделиться

Все, что ненулевое, оценивается как истина в логических операциях, поэтому вы можете просто

#define TRUE 1
#define FALSE 0

и используйте константы.

10
ответ дан 22 November 2019 в 21:47
поделиться
typedef enum {
    false = 0,
    true
} t_bool;
18
ответ дан 22 November 2019 в 21:47
поделиться

Логическое значение в C является целым числом: ноль для false и ненулевое значение для true.

См. Также Логический тип данных , раздел C, C ++ , Objective-C, AWK .

83
ответ дан 22 November 2019 в 21:47
поделиться

C имеет логический тип: bool (по крайней мере, для последних 10 ( !) лет)

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

13
ответ дан 22 November 2019 в 21:47
поделиться

Если вы используете Компилятор C99 имеет встроенную поддержку типов bool:

#include <stdbool.h>
int main()
{
  bool b = false;
  b = true;
}

http://en.wikipedia.org/wiki/Boolean_data_type

46
ответ дан 22 November 2019 в 21:47
поделиться

Несколько мыслей о логических значениях в C:

Я достаточно взрослый, чтобы использовать простые int в качестве логического типа без каких-либо определений типов, специальных определений или перечисления для истинных / ложных значений. Если вы последуете моему предложению, приведенному ниже, о том, чтобы никогда не сравнивать с логическими константами, вам все равно нужно использовать 0/1 для инициализации флагов. Однако в наше время такой подход может показаться слишком реакционным. В этом случае обязательно следует использовать , поскольку он, по крайней мере, имеет преимущество стандартизации.

Какие бы булевы константы ни вызывались, используйте их только для инициализации. Никогда не пишите что-то вроде

if (ready == TRUE) ...
while (empty == FALSE) ...

. Их всегда можно заменить на более четкие

if (ready) ...
while (!empty) ...

. Обратите внимание, что их можно разумно и понятно прочитать вслух.

Дайте вашим логическим переменным положительные имена, например full вместо notfull . Последнее приводит к тому, что код трудно читается. Сравните

if (full) ...
if (!full) ...

с

if (!notfull) ...
if (notfull) ...

Обе предыдущие пары читаются естественно, тогда как ! Notfull неудобно читать даже в том виде, в каком он есть, и становится намного хуже в более сложных логических выражениях.

Булевы аргументы должны обычно следует избегать. Рассмотрим функцию, определенную таким образом

void foo(bool option) { ... }

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

foo(TRUE);
foo(FALSE):

Здесь по существу невозможно сказать, что означает параметр, не глядя на определение или объявление функции, и становится намного хуже, если вы добавляете еще больше логических параметров.

230
ответ дан 22 November 2019 в 21:47
поделиться

@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 ++. Но если вы #define TRUE! FALSE, вы получите:

2
ответ дан 22 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: