TRUE/FALSE
通常在C中定义如下。这些定义是C标准的一部分,它是由不同的编译器实现支持的吗?
#define TRUE 1
#define FALSE 0
答案 0 :(得分:8)
不适用于TRUE
或FALSE
。如果您包含true
,则适用于C99或更高版本中的false
和<stdbool.h>
。
答案 1 :(得分:0)
C99和C11使用名为_Bool
的布尔语义定义整数类型,但不存在实际的真/假关键字。
_Bool
类型只能存储值1和0.任何不比较等于0的值都将转换为1,任何比较等于0的值都将转换为0。
通过加入<stdbool.h>
,_Bool
类型可以像其他语言一样写为bool
,true
和false
C预处理器宏被定义为1和0。
在此之前,某人定义像
这样的常量有点方便#define TRUE 1
#define FALSE 0
typedef char BOOL; /* or #define BOOL char */
或有时
typedef enum {False, True} BOOL;
与C99不同,两者至少有一个缺陷:
BOOL bClicked = False;
++bClicked, ++bClicked;
if (bClicked == False)
printf ("False\n");
else if (bClicked == True)
printf ("True\n");
else
printf ("Unknown: %d\n", bClicked);
那将打印&#34;未知:2&#34;因为定义的BOOL
类型不是真正的布尔类型。
C99版本:
_Bool bClicked = 0;
++bClicked, ++bClicked;
if (bClicked == 0)
printf ("False\n");
else if (bClicked == 1)
printf ("True\n");
else
printf ("Unknown: %d\n", bClicked);
那将打印&#34; True&#34;因为_Bool
只能存储0和1,所以递增1得2,比较不等于0,得到1。
当然,大多数人只是使用这种语言而不是实际比较真/假常数:
if (bClicked)
{
/* True if bClicked does not compare equal to 0 */
}
else
{
/* False */
}
由于这种行为,对布尔类型或真/假常数没有任何实际需要;它们纯粹是为了表达意图而存在。
我依稀记得有人咆哮说某些Windows API函数返回BOOL
类型的值,但TRUE
和FALSE
不是唯一可能的返回值,所以尽管返回一个应该是最后一位代码的简单比较的值,需要更多的比较来处理所有可能的情况。如果当时存在一个实际的布尔类型,那么很可能那些函数,无论它们是什么/将会返回类型为int
的值。 BOOL
返回类型表明只能返回两个值,但显然这些函数的情况并非如此,可能是因为存在第三个(错误)返回值。