C没有任何内置布尔类型。在C语言中使用它们的最佳方式是什么?
当前回答
可以使用_Bool,但返回值必须是整数(1表示真,0表示假)。但是,建议在C++中包含和使用bool,如中所述这个来自daniweb论坛的回答,以及来自另一个stackoverflow问题的回答:
_布尔:C99的布尔类型。只有在维护已经为Bool、true或false定义宏的遗留代码时,才建议直接使用_Bool。否则,这些宏将在标题中标准化。包含该标头,您可以像在C++中一样使用bool。
其他回答
typedef enum {
false = 0,
true
} t_bool;
现在C99支持布尔类型,但需要#include<stdbool.h>。
例子:
#include <stdbool.h>
int main()
{
bool arr[2] = {true, false};
printf("%d\n", arr[0] && arr[1]);
printf("%d\n", arr[0] || arr[1]);
return 0;
}
输出:
0
1
这是我使用的:
enum {false, true};
typedef _Bool bool;
_Bool是C语言中的内置类型,用于布尔值。
如果使用C99,则可以使用_Bool类型。不需要#includes。不过,您确实需要将其视为整数,其中1为真,0为假。
然后可以定义TRUE和FALSE。
_Bool this_is_a_Boolean_var = 1;
//or using it with true and false
#define TRUE 1
#define FALSE 0
_Bool var = TRUE;
第一件事。C、 即ISO/IEC 9899已经有19年的布尔型了。这比访问这个问题时,业余/学术/专业部分的C编程生涯的预期长度要长得多。我的确实超过了这一点,可能只有1-2年。这意味着,在一个普通读者完全了解C的过程中,C实际上拥有布尔数据类型。
对于数据类型,#include<stdbool.h>,并使用true、false和bool。或者不包括它,而是使用_Bool、1和0。
在本主题的其他答案中,有各种危险的做法。我将向他们讲话:
typedef int bool;
#define true 1
#define false 0
这是不可能的,因为一个偶然的读者——在那19年里学习过C语言——会认为bool是指实际的bool数据类型,并且会有类似的行为,但事实并非如此!例如
double a = ...;
bool b = a;
对于C99 bool/_bool,如果a为零,b将设置为false,否则为true。C11 6.3.1.2p1
当任何标量值转换为_Bool时,如果值比较等于0,则结果为0;否则,结果为1。59)脚注59)NaN不等于0,因此转换为1。
在typedef就位的情况下,double将被强制为int-如果double的值不在int的范围内,则行为未定义。
当然,如果在枚举中声明了true和false,这同样适用。
更危险的是宣布
typedef enum bool {
false, true
} bool;
因为现在除了1和0之外的所有值都是无效的,如果将这样的值分配给该类型的变量,则行为将完全未定义。
因此,如果有某种莫名其妙的原因,如果您不能使用C99,则应使用布尔变量:
按原样键入int和值0和1;并小心地将域从任何其他值转换为带有双重否定的值!!或者如果你坚持认为你不记得0是假的和非零真的,那么至少使用大写,这样他们就不会与C99的概念混淆:BOOL、TRUE和FALSE!