繁体   English   中英

在 C 中使用 true 和 false

[英]Using true and false in C

据我所知,在 c 中有 3 种使用布尔值的方法

  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 节。

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

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

我通常做一个:

typedef enum {FALSE = 0, TRUE} boolean;

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

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

#define TRUE 1
#define FALSE 0

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

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

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

您可以测试是否在 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 都是真的; 假为零。 这样,像这样的代码会继续按预期工作:

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

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

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

我曾经使用 #define 是因为它们使代码更易于阅读,并且与使用数字 (0,1) 相比,性能应该不会下降,因为预处理器会在编译前将 #define 转换为数字。 一旦应用程序运行,预处理器就不会再出现,因为代码已经编译好了。

顺便说一句,它应该是:

#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 不存在。

没有真正的速度差异。 它们对编译器来说都是一样的。 不同之处在于人类试图使用和阅读您的代码。

对我来说,这使 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 FALSE (0!=0) 
#define TRUE  (0==0)

或直接在代码中

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

编译器会处理这个。 我使用了很多语言,不得不记住 FALSE 为 0 使我很困扰; 但如果必须的话,我通常会考虑那个字符串循环

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

这让我看到 FALSE 是 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM