false和FALSE有什么区别?

29
在许多程序中,我看到了带有标识符 FALSEfalse 的语句。在 C++ 的上下文中,它们之间有什么区别吗?
此外,在一些程序中,我看到了 boolBOOL,这两者之间有什么区别?
有谁能向我解释这些标识符之间的区别?谢谢。

这是在Windows下吗?那么它是C时代的遗留物,当时它没有真正的布尔值,FALSE被定义为0。 - RedX
@RedX:你的意思是FALSE是由布尔值定义的,那么false呢? - RidaSana
不,FALSE 是这样定义的:#define FALSE (0) - John Dibling
2
false 是编程语言的一部分。 - John Dibling
6个回答

32
如果你包含了windows.h头文件,那么FALSE被定义为0。TRUE被定义为1。它并不是一个布尔类型,而是一个整型。Windows也定义了BOOL类型,它实际上是一个整型类型,旨在容纳TRUEFALSE这两个值。 windows.h中相关代码的部分如下所示:
#ifdef FALSE
#undef FALSE
#endif
#define FALSE 0

#ifdef TRUE
#undef TRUE
#endif
#define TRUE  1

typedef int    BOOL,    *PBOOL,    *LPBOOL;

Windows最初是用C语言编写的,所有原始的Windows应用程序也是如此。当时,C语言标准没有定义布尔类型。开发人员不得不定义自己的布尔常量。为了避免可能带来的混乱,微软决定采用一种标准,将其用于所有Windows应用程序。

如果你正在编写Windows应用程序,可能仍需要使用TRUEFALSE这两个标识符。在windows.h中定义的多个函数要么接受布尔参数(实际上是整数!),类型为BOOL,要么返回此类类型的值。由于C++具有强类型,因此如果您将它们强制转换为语言标准中定义的布尔型,则可能会出现警告。为确保一致性,在我调用Windows API函数时使用旧标识符,在我自己编写的所有方法中使用标准中定义的truefalse关键字。

实际上没有理由不使用windows.h中定义的FALSE。但是,您不应使用专有头文件中自己定义的布尔常量,正如其他人所提到的那样,因为不能保证定义随时间的变化而保持不变。这可能会导致一些非常愚蠢的错误,这种错误充其量只能出现在《每日WTF》上。

Mat's answer完全正确,C或C++标准都没有定义TRUEFALSE。但是,它们由Windows API严格定义并保证不会更改。在编写Windows应用程序时使用它们不会产生真正跨平台、符合标准的C++代码,但这很少是一个关注点,因为调用windows.h中的任何其他函数也不会。


@Cody:第二部分关于bool和BOOL的问题怎么样了? - RidaSana
1
@Miss:我在我的答案更新中添加了这个。简洁地说,bool是C++标准中定义的布尔类型。它与同样小写的truefalse关键字一起使用。BOOL是一个整数类型,由windows.h定义,旨在与同样大写的TRUEFALSE一起使用。很容易记住,因为每个组的情况都匹配。 - Cody Gray
1
@Miss:不,我不这么认为。BOOL类型只定义为与TRUEFALSE一起使用。这都是windows.h的一部分。如果您没有理解我的上一条评论,我很乐意进一步解释。 :-) - Cody Gray
1
@Miss:这是一种口语化的说法,意思是“不”。我是在回复你关于创建一个新问题来讨论boolBOOL之间区别的评论。我猜你现在已经删除了那个评论,因为你看到了我在它之前发布的评论。 - Cody Gray
1
@Miss:嗯,可能不重要。这也定义了指向BOOL类型(*PBOOL)的指针,以及指向BOOL类型的长指针(*LPBOOL)。如果你知道C ++,你已经知道指针了。你永远不需要知道长指针;当Windows 95在1995年推出时,它们变得不相关了。它们是旧的DOS / Win16事物,在微处理器架构不同的情况下很重要。现在只是历史的一种好奇心。 - Cody Gray
显示剩余3条评论

15

FALSE在标准中未定义,只有false是标准定义的。 truefalse被称为“布尔字面量”,是C++中的关键字。

FALSE有时被定义为宏。由于它不是标准的一部分,因此不能保证在符合标准的环境中存在。

换句话说,以下程序是有效的C++程序:

#include <iostream>

#define FALSE 1

int main()
{
    bool a = false;
    bool b = FALSE;
    std::cout << a << " " << b << std::endl;
    return 0;
}

并且它将按预期打印0 1FALSE在任何方面都不是特权符号。


但是FALSE和false都返回0,这意味着它们的类型都是bool,对吗? - RidaSana
2
不要使用标准的C++语法。TRUEFALSE可以被定义(通常作为宏,有时作为枚举值),但是你不能依赖它。例如,在Linux上使用GCC编译器时,bool something = FALSE;会产生编译时错误,因为FALSE未定义。当FALSE被定义时,通常会被定义为0false - 但这不是你应该依赖的东西。请依赖于标准。 - Mat
关于 bool 和 BOOL 的第二个问题怎么样? - RidaSana
正如@Code Gray指出的那样,它也不是标准的C++类型。 - Mat
@RidaSana:BOOL通常被定义为"typedef int BOOL;"或"typedef unsigned char BOOL;"。这是从C语言中延续下来的,因为当时没有类型来表示布尔值。 - Thomas Matthews
1
你甚至可以执行 #define false true,哇! - Thomas Eding

2
在C++中,false是一个布尔类型的内置字面量,表示false值(另一个可能的值由字面量true表示)。
FALSE是一个#define,在不同平台下定义可能有所不同,但通常为0。

这意味着false和FALSE都是布尔类型... FALSE表示0,但false也应该是0,因为它是布尔类型.. 对吧? - RidaSana
1
false不会被评估为0,而是被强制转换为0(或者如果您喜欢的话,可以转换,就像将int隐式转换为float一样)。预处理器将FALSE重写为0。请注意,FALSE也可能由false定义,这取决于平台。 - Gabriel Cuvillier
1
@Miss:不,FALSE 可能是一个布尔类型,但通常它是一个整数类型。您可以将其用作布尔值,但它仍然是整数型。这在模板推导和重载函数解析方面非常重要,例如,如果 FALSE 展开为 0,则 f(false)f(FALSE) 可以调用两个完全不同的函数。 - Dennis Zickefoose

1

false 是 C++ 的一个关键字。

FALSE 在 C++ 标准中并未定义。但大多数编译器将 FALSE 定义为一个预处理宏,其值为 0。


@Miss: "预定义"?在大多数情况下,您将需要#include一些头文件以获取#define。 - harper

1

只需记住真和假的布尔值始终代表什么。它们始终将是整数(0,1)。编译器可能无法识别,但它们始终会作为整数存储和通过CPU运行。调试器将显示此内容。无论它是否大写并不重要,因为在其实现或使用中不应有任何区别。如果您的编译器编写了一些支持大小写真和假的宏,那就太好了,但这只是为了适应您的需求。就像所有其他类型一样。


0

关于Windows API的重要说明:一些Windows库函数返回任意整数值,尽管返回类型被定义为BOOL。最好永远不要将BOOLTRUE进行比较。使用

  bSomeVal != FALSE instead.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接