据我所知,有3种在c语言中使用布尔值的方法
- 从布尔类型开始,然后使用true和false
- 使用预处理器进行定义
#define FALSE 0 ... #define TRUE !(FALSE)
- 只是直接使用常量,即1和0
还有其他我错过的方法吗?不同方法的优缺点是什么?
我想最快的将是数字3,2仍然更容易阅读(尽管按位取反会稍微增加开销),1可读性最高而不与所有编译器兼容。
据我所知,有3种在c语言中使用布尔值的方法
#define FALSE 0 ... #define TRUE !(FALSE)
还有其他我错过的方法吗?不同方法的优缺点是什么?
我想最快的将是数字3,2仍然更容易阅读(尽管按位取反会稍微增加开销),1可读性最高而不与所有编译器兼容。
int i = 12 + 3 * 4;
; 它只会说int i = 24;
。担心这样的性能是一个常见问题,不要感到难过。优化是最后一个,当它实现时,您必须计时代码并查看程序集输出,而不是猜测。即使花费了一个周期,我还是会选择最易读的解决方案。仅当它被证明是
(x == TRUE)
不同(x)
。前者只有在x
具有的值时才是正确的TRUE
。后者适用于任何非零值。
if(foo == TRUE)
或的代码if(foo == FALSE)
,这在大多数语言中都是很糟糕的,而在C语言中则更是如此,在C语言中,任何标量值!= 0
在布尔上下文中都被认为是正确的;类似的,但不太严重的原因,我不喜欢if(foo != NULL)
和if(foo == NULL)
为指针; 因为这不能将bug作为可以比较的TRUE
方法,所以仅是口味问题,但是使用if(foo)
和if(!foo)
标量值更适合C语言的外观和风格
Answers:
仅<stdbool.h>
在系统提供的情况下包括。定义了许多宏,包括bool
,false
和true
(分别定义为_Bool
,0和1)。有关更多详细信息,请参见C99的7.16节。
_Bool
不使用就使用stdbool.h
只需在代码中直接使用0或1。
对于C程序员来说,这是对还是错。
int
类型)的事实有时使人们不清楚是否应该在布尔上下文中使用值。
int fail = close(fd); if (!fail) { great(); } else { weep(); }
我通常会做:
typedef enum {FALSE = 0, TRUE} boolean;
FileNotFound
到该枚举的前面。;-)
无论您使用哪三个,请将变量与FALSE进行比较,否则为false。
从历史上看,在c或c ++中将任何内容与true(1)进行比较都是一个坏主意。只有false保证为零(0)。真是其他任何价值。许多编译器供应商的标头中都有这些定义。
#define TRUE 1
#define FALSE 0
这导致太多人沿着花园小路走。许多库函数除了chartype
返回不等于1
成功值的非零值之外,还返回其他值。有很多具有相同行为的遗留代码。
我会争取1。我没有遇到不兼容的情况,这很自然。但是,我认为它是C ++而不是C标准的一部分。我认为使用define或第三个选项进行肮脏的黑客攻击-不会获得任何性能,而只会维护代码。
bool
是C ++的一部分,但是_Bool(带有bool
别名)现在是C的一部分(从C99开始)。
除零以外的任何int都是真实的;假为零。这样的代码将继续按预期工作:
int done = 0; // `int` could be `bool` just as well
while (!done)
{
// ...
done = OS_SUCCESS_CODE == some_system_call ();
}
IMObool
是一种被高估的类型,可能是其他语言的遗留物。 int
可以作为布尔类型正常工作。
bool
是一个单独的类型,因此它可以参与函数重载,原因与char
在C ++中字符常量是类型的许多原因相同。当然,这不适用于没有函数重载的C语言。
_Bool
布尔值上下文,这也是许多动态语言中都具有的功能
_Bool
是,它允许编译器以最有效的方式(字节,字,位或其他方式)存储它;甚至可以给您选择在编译时确定其大小的选项(例如在某些编译器中,您可以将其指定int
为2或4个字节,或者指定long
为4或8个字节)。是否有一个处理器想以单词的形式访问事物?使_Bool
单词大小。您的处理器是否像字一样容易访问字节?使其成为一个字节以节省空间。有位访问说明?也许吧,也许不是。延续C悠久的传统,即不缩小int
尺寸……
我以前使用#define是因为它们使代码更易于阅读,并且与使用数字(0,1)相比,性能不应降低,因为预处理器在编译之前将#define转换为数字。一旦应用程序运行,预处理器就不会再次出现,因为代码已经被编译。
顺便说一句,它应该是:
#define FALSE 0
#define TRUE 1
并记住-1,-2,...,2、3等都计算为true。
!1
返回0,但!0
返回一个真值,该值可能是各种各样的数字。#define TRUE !(FALSE)
确保TRUE == !0
无论!0
返回什么确切值。
我不知道你的具体情况。回到我编写C程序时,我们一直使用#2。
#define FALSE = 0
#define TRUE = !FALSE
否则,这可能是在DOS或基于Intel的处理器的外来平台下。但是我曾经同时使用C和ASM来编写图形库和图形IDE。我是Micheal Abrash的忠实粉丝,并打算学习纹理映射等等。无论如何!这不是这里的问题!
这是在C中定义布尔值的最常用形式,因为那时该头文件stdbool.h不存在。
#define TRUE = 1
呢?
1最易读,并不兼容所有编译器。
没有ISO C编译器具有称为的内置类型bool
。ISO C99编译器具有一个type_Bool
和一个typedef的标头bool
。因此,如果编译器不符合C99(例如VC ++),则兼容性只是提供您自己的标头的一种情况。
当然,更简单的方法是将C代码编译为C ++。
我更喜欢第三个解决方案,即使用1和0,因为它在必须测试条件是对还是错时特别有用:您可以简单地将变量用作if参数。
如果您使用其他方法,我认为,为了与其余代码保持一致,我应该使用这样的测试:
if (variable == TRUE)
{
...
}
代替:
if (variable)
{
...
}