在C中使用true和false

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C中使用true和false相关的知识,希望对你有一定的参考价值。

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

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

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

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

答案

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

另一答案

没有真正的速度差异。它们与编译器完全相同。不同之处在于人类试图使用和阅读您的代码。

对我来说,使bool,true和false成为C ++代码中的最佳选择。在C代码中,有些编译器不支持bool(我经常需要使用旧系统),所以我可能会在某些情况下使用定义。

另一答案

1最易读,与所有编译器不兼容。

没有ISO C编译器具有称为bool的内置类型。 ISO C99编译器有一个_Bool类型,以及一个typedef的bool标题。因此,如果编译器不符合C99(例如VC ++),那么兼容性就是提供自己的头的情况。

当然,更简单的方法是将C代码编译为C ++。

另一答案

我更喜欢第三种解决方案,即使用1和0,因为当你必须测试条件是真还是假时它特别有用:你可以简单地使用一个变量作为if参数。 如果你使用其他方法,我认为,为了与代码的其余部分保持一致,我应该使用这样的测试:

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

代替:

if (variable)
{
   ...
}
另一答案

我以前使用#define因为它们使代码更容易阅读,并且与使用数字(0,1)相比,应该没有性能降级。预处理器在编译之前将#define转换为数字。一旦运行应用程序,预处理器就不会再次出现,因为代码已经编译完毕。

BTW它应该是:

#define FALSE 0 
#define TRUE 1

并记住-1,-2,... 2,3等等都评估为真。

另一答案

我不知道你的具体情况。回到编写C程序时,我们总是使用#2。

#define FALSE = 0
#define TRUE = !FALSE

这可能是在DOS或基于Intel的处理器的外来平台下。但我曾经同时使用C和ASM编写图形库和图形IDE。我是Micheal Abrash的忠实粉丝,并打算学习纹理映射等等。无论如何!这不是问题的主题!

这是在C中定义布尔值的最常用形式,因为此头文件stdbool.h不存在。

另一答案

我更喜欢使用

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

或直接在代码中

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

编译器会处理这个问题。我使用了很多语言,并且必须记住FALSE是0困扰我很多;但如果必须,我通常会想到那个字符串循环

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

这让我看到FALSE为0

另一答案

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

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

另一答案

我通常做一个:

typedef enum {FALSE = 0, TRUE} boolean;
另一答案

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

总之,当可移植性很重要时,我会坚持使用宏。否则,做别人推荐的事情并使用类型的bulit。

另一答案

无论你选择哪三个,都要将你的变量与FALSE进行比较,或者将其变为假。

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

#define TRUE 1 #define FALSE 0

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

另一答案

您可以测试是否在c99 stdbool.h中定义了bool

#ifndef __bool_true_false_are_defined || __bool_true_false_are_defined == 0
//typedef or define here
#endif
另一答案

我会选择1.我没有遇到与它的不兼容,更自然。但是,我认为它是C ++的一部分而不是C标准。我认为,使用定义或第三种选择进行肮脏的黑客攻击 - 不会获得任何性能,但只能维护代码。

另一答案

我更喜欢(1)当我定义一个变量但在表达式中我从不与true和false进行比较时只需采用if(flag)或if(!flag)或if(ptr)的隐式C定义。这是做事的C方式。

另一答案

除零以外的任何int都是真的; false为零。这样的代码继续按预期工作:

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

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

IMO,bool是一种被高估的类型,也许是其他语言的结转。 int作为布尔类型工作得很好。

以上是关于在C中使用true和false的主要内容,如果未能解决你的问题,请参考以下文章

在C中使用true和false

存在嵌套片段时 setRetainInstance(true) 将不起作用

2022-09-30:以下go语言代码输出什么?A: true true false true false; B: true false false true false; C: true true

在 c 中,在 bool 中,true == 1 和 false == 0?

2022-10-28:以下go语言代码输出什么?A:false false;B:true false;C:true true;D:false true。 package main import “f

布尔类型和三目运算符