在C中使用true和false
据我所知,有三种方法可以在c中使用布尔值
- 与布尔types,从那时起使用真假
- 使用预处理器
#define FALSE 0 ... #define TRUE !(FALSE)
定义#define FALSE 0 ... #define TRUE !(FALSE)
- 只是直接使用常量,即1和0
还有其他的方法我错过了吗? 什么是不同的方法的利弊?
我认为最快的是3号,2号更容易阅读(尽pipe按位否定会稍微增加开销),1是最可读的,不兼容所有的编译器。
只要包含<stdbool.h>
如果你的系统提供了它。 它定义了许多macros,包括bool
, false
和true
(分别定义为_Bool
,0和1)。 有关更多详细信息,请参阅C99的7.16节。
只需在代码中直接使用0或1即可。
对于C程序员来说,这与直接或间接一样直观。
我通常做一个:
typedef enum {FALSE = 0, TRUE} boolean;
使用stdbool.h定义的booltypes时,需要将代码从支持booltypes的较新的编译器移动到较旧的编译器时出现问题。 当您使用基于老版本规范的C编译器移植到新架构时,可能会发生在embedded式编程环境中。
总之,当可移植性问题时,我会坚持使用macros。 否则,做别人推荐的,并使用types的bulit。
您可以testingbool是否在c99 stdbool.h中定义
#ifndef __bool_true_false_are_defined || __bool_true_false_are_defined == 0 //typedef or define here #endif
我会去争取1.我没有遇到与它不兼容,更自然。 但是,我认为它是C ++而不是C标准的一部分。 我认为,使用定义或第三种select进行肮脏的黑客攻击 – 不会获得任何性能,但只能维护代码。
我更喜欢(1)当我定义一个variables,但在expression式中,我从来没有比较真正和假只是采取隐(如果(标志)或如果(!标志)或如果(ptr)的C定义。 那是C做事情的方式。
除零以外的任何整数都是真的; 假是零。 这样的代码像这样继续按预期工作:
int done = 0; // `int` could be `bool` just as well while (!done) { // ... done = OS_SUCCESS_CODE == some_system_call (); }
国际海事组织, bool
是一个被高估的types,也许是其他语言的结转。 int
作为布尔types工作得很好。
我不了解你的具体情况。 当我编写C程序时,我们一直使用#2。
#define FALSE = 0 #define TRUE = !FALSE
这可能是在DOS或基于Intel的处理器的外星平台下。 但我曾经使用C和ASM一起编写graphics库和graphics化IDE。 我是Micheal Abrash的忠实粉丝,并且正打算学习纹理贴图等等。 无论如何! 这不是这个问题的主题!
这是在C中定义布尔值的最常用的forms,因为这个头文件stdbool.h不存在。
没有真正的速度差异。 它们和编译器是完全一样的。 不同之处在于人类试图使用和阅读你的代码。
对我来说,使bool,true和false是C ++代码中的最佳select。 在C代码中,有一些编译器不支持bool(我经常需要使用旧系统),所以在某些情况下我可能会使用这个定义。
1是最可读的,不兼容所有的编译器。
没有ISO C编译器有一个名为bool
的内置types。 ISO C99编译器有一个_Bool
types和一个typedef的bool
的头文件。 所以如果编译器不符合C99标准(例如VC ++),兼容性就是提供自己的头文件。
当然,更简单的方法是将C代码编译为C ++。
我更喜欢第三种解决scheme,即使用1和0,因为当你必须testing一个条件是真还是假时,它是特别有用的:你可以简单地为if参数使用一个variables。
如果您使用其他方法,我认为为了与其他代码保持一致,我应该使用这样的testing:
if (variable == TRUE) { ... }
代替:
if (variable) { ... }
无论您select哪一种,都将您的variables与FALSE进行比较,或将其作为错误。
从历史上来看,把c和c ++中的任何东西都与真(1)进行比较是一个坏主意。 只有false才能保证为零(0)。 真是其他的价值 。 许多编译器供应商在头文件中都有这些定义。
#define TRUE 1
#define FALSE 0
这导致太多的人走下花园的路上。 除了图表types之外,许多库函数在成功时返回不等于1的非零值。 有相当多的遗留代码在那里有相同的行为。
我曾经使用#define,因为它们使得代码更容易阅读,并且与使用数字(0,1)相比,应该没有性能下降。“预处理器在编译之前将#define转换为数字。 一旦应用程序运行,预处理程序不会再来,因为代码已经编译。
顺便说一句,它应该是:
#define FALSE 0 #define TRUE 1
并记住-1,-2,… 2,3等都评估为真。