是CUE标准的TRUE / FALSE吗?

时间:2014-09-06 01:48:51

标签: c

TRUE/FALSE通常在C中定义如下。这些定义是C标准的一部分,它是由不同的编译器实现支持的吗?

#define TRUE 1
#define FALSE 0

2 个答案:

答案 0 :(得分:8)

不适用于TRUEFALSE。如果您包含true,则适用于C99或更高版本中的false<stdbool.h>

答案 1 :(得分:0)

C99和C11使用名为_Bool的布尔语义定义整数类型,但不存在实际的真/假关键字。

_Bool类型只能存储值1和0.任何不比较等于0的值都将转换为1,任何比较等于0的值都将转换为0。

通过加入<stdbool.h>_Bool类型可以像其他语言一样写为booltruefalse 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类型的值,但TRUEFALSE不是唯一可能的返回值,所以尽管返回一个应该是最后一位代码的简单比较的值,需要更多的比较来处理所有可能的情况。如果当时存在一个实际的布尔类型,那么很可能那些函数,无论它们是什么/将会返回类型为int的值。 BOOL返回类型表明只能返回两个值,但显然这些函数的情况并非如此,可能是因为存在第三个(错误)返回值。