提问



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

最佳参考


选项1


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


选项2


typedef int bool;
enum { false, true };


选项3


typedef enum { false, true } bool;


选项4(C99)


#include 


解释




  • 选项1,2和3在实践中将具有相同的相同行为。 #2和#3虽然不使用#defines,但在我看来更好。

  • 选项4仅在您使用C99时才有效,并且它是标准方式。如果可能,请选择此项。



如果你还未定,请选择#3!

其它参考1


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


我已经够老了,我只使用普通的int作为我的布尔类型,没有任何typedef或特殊的定义或枚举的真/假值。如果你按照我的建议从不与布尔常量进行比较,那么你只有无论如何都需要使用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):


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


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


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


另请参阅布尔数据类型, C,C ++,Objective-C,AWK 部分。[69]

其它参考3


这是我使用的版本:


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


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


#include 
int main()
{
  bool b = false;
  b = true;
}


http://en.wikipedia.org/wiki/Boolean_data_type[70]

其它参考5


typedef enum {
    false = 0,
    true
} t_bool;

其它参考6


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


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

其它参考7


在布尔运算中,任何非零值都会被计算为true,所以你可以这样做


#define TRUE 1
#define FALSE 0


并使用常量。

其它参考8


首先要做的事情。 C,即ISO/IEC 9899具有 19年的布尔类型。当访问这个问题时,这会比业余/学术/专业部分的C编程职业的预期长度更长。我的确超过了大约1 - 2年。然而,在期间,普通读者已经亚博2018平台了关于C的任何内容,C实际上已经具有布尔数据类型[71]


对于数据类型,#include ,并使用truefalsebool。或者不包含它,并使用_True_False_Bool代替。





在这个答案线程中有各种危险建议。我会解决他们:


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


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


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


使用C99 bool/_Boolb将设置为false iff a为零,true除此以外。在typedef到位的情况下,double将被强制转换为int - 如果double的值不在int int的范围内,则行为未定义


当然,如果在enum中声明truefalse,则同样适用。


什么是更危险宣布


typedef enum bool {
    false, true
} bool;


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


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



  • 输入int和值01 按原样;并通过双重否定!!
  • 小心地将域转换从任何其他值转换为这些值
  • 或者如果你坚持你不记得0是假的而非零的,至少使用大写,这样他们就不会混淆C99概念:BOOLTRUEFALSE!


其它参考9


@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 ++ bool。但如果你#define TRUE!FALSE,你最终得到:


foo(flag == !0);


最终做了一个int-to-bool比较,无论如何都可以触发警告。

其它参考10


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


Pseduo


#define TRUE  1
#define FALSE 0

char bValue = TRUE;

其它参考11


它是这个:


#define TRUE 1
#define FALSE 0

其它参考12


您可以简单地使用#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);


等等