在C中使用布尔值

时间:2009-12-17 12:46:49

标签: c boolean

C没有任何内置布尔类型。在C中使用它们的最佳方法是什么?

18 个答案:

答案 0 :(得分:941)

从最好到坏:

选项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!

答案 1 :(得分:216)

关于C中布尔值的一些想法:

我已经够老了,我只使用普通int作为我的布尔类型,没有任何typedef或特殊定义或枚举的真/假值。如果您按照我的建议从不与布尔常量进行比较,那么您只需要使用0/1来初始化标志。然而,在这些现代时代,这种方法可能被认为过于反动。在这种情况下,绝对应该使用<stdbool.h>,因为它至少具有标准化的好处。

无论调用什么布尔常量,只能将它们用于初始化。永远不要写像

这样的东西
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):

在这里,基本上不可能在不总是查看函数定义或声明的情况下告诉参数意味着什么,如果添加更多的布尔参数,它会变得更糟。我建议

typedef enum { OPT_ON, OPT_OFF } foo_option;
void foo(foo_option option);

#define OPT_ON true
#define OPT_OFF false
void foo(bool option) { ... }

在任何一种情况下,呼叫站点现在看起来像

foo(OPT_ON);
foo(OPT_OFF);

读者至少有机会理解而不会疏导foo的定义。

答案 2 :(得分:80)

C中的布尔值是一个整数:零表示假,非零表示真。

另见Boolean data type, section C, C++, Objective-C, AWK

答案 3 :(得分:69)

以下是我使用的版本:

typedef enum { false = 0, true = !false } bool;

因为false只有一个值,但逻辑true可能有很多值,但是技术设置为true,编译器将使用与false相反的值。

这解决了某人编写某些问题的问题:

if (true == !false)

我认为我们都同意这不是一个好的做法,但是对于做“真=假”的一次性成本,我们就消除了这个问题。

[编辑]最后我使用了:

typedef enum { myfalse = 0, mytrue = !myfalse } mybool;

避免与定义truefalse的其他方案发生名称冲突。但这个概念仍然是一样的。

[编辑]显示整数转换为布尔值:

mybool somebool;
int someint = 5;
somebool = !!someint;

第一个(最右边)!将非零整数转换为0,然后是第二个(最左边)!将0转换为myfalse值。我将把它作为练习让读者转换零整数。

答案 4 :(得分:43)

如果您使用的是C99编译器,它内置了对bool类型的支持:

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

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

答案 5 :(得分:17)

typedef enum {
    false = 0,
    true
} t_bool;

答案 6 :(得分:17)

首先要做的事情。 C,即ISO / IEC 9899具有 19年的布尔类型。这比参加这个问题的业余/学术/专业部分的C编程职业expected长度的时间更长。我的确超过了大概1 - 2年。这意味着在期间,普通读者已经学习了关于C的任何内容,C实际上已经具有布尔数据类型

对于数据类型#include <stdbool.h>,并使用truefalsebool。或者不要包含它,而是使用_Bool10代替。

此答案帖中有各种危险建议。我会解决他们:

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

这是禁忌,因为在这19年内确实学习过C的随意读者会期望bool指的是实际 bool数据类型会表现得相似,但它并没有!例如

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

使用C99 bool / _Boolb将设为false iff a为零,{{ 1}}否则。在true到位的情况下,typedef将被强制转换为double - 如果双倍的值不在int的范围内,则<{1}} strong>行为未定义。

当然,如果在int中宣布truefalse,则同样适用。

什么是更危险宣布

enum

因为除了1和0之外现在所有值都是无效的,并且应该将这样的值分配给该类型的变量,行为将完全未定义。< / p>

因此 iff 您无法使用C99出于某种莫名其妙的原因,对于布尔变量,您应该使用:

  • 输入typedef enum bool { false, true } bool; 和值int0 按原样;并通过双重否定1
  • 仔细进行从任何其他值到这些域的转换
  • 或者如果你坚持你不记得0是假的而且非零的,至少使用大写以便他们不会这样做。与C99概念混淆:!!BOOLTRUE

答案 7 :(得分:11)

C有一个布尔类型: bool (至少在过去10年(!)年内)

包括stdbool.h和true / false将按预期工作。

答案 8 :(得分:9)

在布尔运算中,任何非零值都会被计算为true,因此您可以

#define TRUE 1
#define FALSE 0

并使用常量。

答案 9 :(得分:2)

如果您使用的是c99,则可以使用c99的_Book类型,即不需要#includes。不过,您确实需要将其视为int,其中1 = true和0 = false。 然后,您可以定义TRUE和FALSE。

_Bool this_is_a_Boolean_var = 1;


//or using it with true and false
#define TRUE 1
#define FALSE 0
_Book var = TRUE;

答案 10 :(得分:1)

@Thomas Matthews:如果条件表达式非零,则认为条件表达式为真,但C标准要求逻辑运算符本身返回0或1。

@Tom:#define TRUE!FALSE很糟糕,完全没有意义。如果头文件进入已编译的C ++代码,那么它可能会导致问题:

void foo(bool flag);

...

int flag = TRUE;
foo(flag);

有些编译器会生成关于int =&gt;的警告。布尔转换。有时人们通过这样做来避免这种情况:

foo(flag == TRUE);

强制表达式为C ++ bool。但是如果你#define是真的!假,你最终得到:

foo(flag == !0);

最终会进行int-to-bool比较,无论如何都会触发警告。

答案 11 :(得分:1)

现在有一天C99 standard for C language支持布尔类型,但是您需要<textbox ... (change)="openMonthpicker = false"> </textbox> 库来运行它。

#include <stdbool.h>

有趣的细节

  • 您可以在没有#include <stdbool.h> int main() { bool arr[2] = {true, false}; return 0; } 的情况下运行此文件,但必须包含#include <stdio.h>。 (但是每次尝试使用#include <stdbool.h>
  • 请勿将此程序另存为#include <stdio.h>。这是行不通的。在那里另存为.c

示例

.cpp

输出-:

#include <stdbool.h> 
int main() 
{ 
    bool arr[2] = {true, false}; 

    printf("%d\n", arr[0] && arr[1]);
    printf("%d\n", arr[0] || arr[1]);

    return 0; 
} 

答案 12 :(得分:1)

这是我使用的:

enum {false, true};
typedef _Bool bool;

_Bool是C语言中的内置类型。它用于布尔值。

答案 13 :(得分:0)

您可以使用char或其他小号容器。

<强>伪代码

#define TRUE  1
#define FALSE 0

char bValue = TRUE;

答案 14 :(得分:0)

就是这样:

#define TRUE 1
#define FALSE 0

答案 15 :(得分:0)

如果允许使用C99,则只是对其他答案的补充和澄清。

+-------+----------------+-------------------------+--------------------+
|  Name | Characteristic | Dependence in stdbool.h |        Value       |
+-------+----------------+-------------------------+--------------------+
| _Bool |   Native type  |    Don't need header    |                    |
+-------+----------------+-------------------------+--------------------+
|  bool |      Macro     |           Yes           | Translate to _Bool |
+-------+----------------+-------------------------+--------------------+
|  true |      Macro     |           Yes           |   Translate to 1   |
+-------+----------------+-------------------------+--------------------+
| false |      Macro     |           Yes           |   Translate to 0   |
+-------+----------------+-------------------------+--------------------+

我的一些偏好:

  • _Boolbool?两者都很好,但是bool看起来比关键字_Bool更好。
  • bool_Bool的接受值为:falsetrue。分配01而不是falsetrue是有效的,但更难于阅读和理解逻辑流程。

标准中的一些信息:

  • _Bool不是unsigned int,但属于无符号整数类型组的一部分。它足够大,可以容纳值01
  • 不要这样做,但是可以,您可以重新定义bool truefalse,但是肯定不是一个好主意。该功能被认为已过时,以后将被删除。
  • 如果标量值等于{{,则将标量类型(算术类型和指针类型)分配给_Boolbool 1}}或与0进行比较,它将为0,否则结果为01 _Bool x = 9;在分配时转换为91
  • x是1字节(8位),通常程序员倾向于尝试使用其他位,但是不建议这样做,因为给出的唯一保证是仅使用一位来存储数据,而不像类型_Bool那样有8位可用。

答案 16 :(得分:0)

您可以使用_Bool,但是返回值必须是整数(1表示true,0表示false)。 但是,建议像在C ++中那样包含和使用bool,如 this reply中的daniweb forum以及另一个堆栈溢出问题中的this answer

  

_Bool:C99的布尔类型。仅当您要维护已为bool,true或false定义宏的旧代码时,才建议直接使用_Bool。否则,这些宏将在标头中标准化。包含该标头,就可以像在C ++中一样使用bool。

答案 17 :(得分:-2)

您可以按如下方式使用#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);

等等......