在C中使用true和false

Tom*_*Tom 59 c coding-style

据我所知,有三种方法可以在c中使用布尔值

  1. 用bool类型,从那时候使用true和false
  2. 使用预处理器定义 #define FALSE 0 ... #define TRUE !(FALSE)
  3. 只是直接使用常量,即1和0

我错过了其他方法吗?不同方法的优缺点是什么?

我想最快的是3号,2号更容易读取(尽管按位否定会略微增加开销),1是最易读的,与所有编译器不兼容.

Chr*_*ung 100

只是包括<stdbool.h>,如果你的系统提供了它.它定义了许多宏,包括bool,falsetrue(分别定义为_Bool0和1).有关详细信息,请参阅C99的第7.16节.

  • 没有"bool"是一个宏.类型是"_Bool".否则它会严重破坏旧代码. (10认同)
  • 在我之前的评论中,我无法相信我拼错了.哦,如果只有旧评论可以编辑.;-) (7认同)
  • 您可以使用`_Bool`而不包括`stdbool.h` (3认同)

b.r*_*oth 18

只需在代码中直接使用0或1即可.

对于C程序员来说,这就像真或假一样直观.

  • 对于C程序员,-1也是如此,因为它不是零.就此而言,42和-234也是真值.我已经看到-1,-2和其他值为true.有些函数返回0(零)成功.嗯,非常一致. (32认同)
  • 我同意托马斯的观点.0用作"无错误"的错误代码(通常也作为"int"类型)的事实有时会使得一个值应该在布尔上下文中使用是不明显的. (5认同)
  • 想象一个函数返回0表示无错误,回答问题"你有没有问题?" - "0 =假=否".`int fail = close(fd); if(!fail){great(); } else {weep(); }` (5认同)
  • @squelart:问题是许多返回布尔值的函数没有这种语义,成功时返回真值,失败时返回假值。(例如,大部分 Win32 API 都是以这种方式设计的。) (2认同)

Mac*_*rse 14

我通常做一个:

typedef enum {FALSE = 0, TRUE} boolean;
Run Code Online (Sandbox Code Playgroud)

  • @lindelof这是为了防止他们将[`FileNotFound`](http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx)添加到该枚举的前面.;-) (8认同)
  • 为什么你明确设置FALSE = 0?枚举的第一个元素不是自动为0吗? (5认同)
  • @lindelof 这是有道理的。确保 FALSE 为 0 是唯一重要的事情。TRUE 可以是任何东西,只要它不同即可。 (2认同)

Dou*_* T. 5

使用 stdbool.h 定义的 bool 类型,当您需要将代码从支持 bool 类型的较新编译器移动到较旧编译器时会出现问题。当您使用基于旧版本规范的 C 编译器迁移到新架构时,这可能会发生在嵌入式编程环境中。

总而言之,当便携性很重要时,我会坚持使用宏。否则,按照其他人的建议并使用内置类型。


Bob*_*eld 5

无论您选择这三个中的哪一个,将您的变量与 FALSE 或 false 进行比较。

从历史上看,在 c 或 c++ 中将任何内容与 true (1)进行比较是一个坏主意。只有 false 保证为零 (0)。True 是任何其他值。许多编译器供应商在其头文件中的某处都有这些定义。  

#define TRUE 1
#define FALSE 0
Run Code Online (Sandbox Code Playgroud)

这导致太多人走上花园小径。除了成功之外,许多库函数还chartype返回不等于的非零值1。有大量具有相同行为的遗留代码。

  • 我注意到与 TRUE 的比较对未初始化的变量失败。最好初始化您的布尔值并与 FALSE 进行比较。如果您确实需要三个值,则枚举会更好;不,是的,而且不知道。将枚举初始化为不知道。不要将枚举视为布尔值。不是。 (2认同)