false和FALSE有什么区别?
在很多程序中,我看到标识为FALSE
和false
的语句。它们在C++的环境中有什么区别吗?我也看到了bool
和BOOL
。这两者之间有什么区别?false和FALSE有什么区别?
任何人都可以解释这些标识符与我之间的区别吗?谢谢。
如果所包含windows.h
,然后FALSE
已经#defined为0 TRUE
已经#defined为1。这是不布尔类型,它是一个整数类型。 Windows还定义了类型BOOL
,它实际上是一个整数类型,用于容纳值为TRUE
和FALSE
。在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应用程序,则可能仍需要使用TRUE
和FALSE
标识符。在windows.h
中定义的几个函数要么接受布尔参数(实际上是整数!),类型为BOOL
或返回此类型的值。强类型的C++可能会抱怨,如果将它们强制转换为语言标准中定义的布尔类型。为了保持一致性,我在使用Windows API函数的所有调用中使用旧的标识符,以及在我编写自己的所有方法中现在由标准定义的关键字true
和false
。
真的没有理由不使用FALSE
,因为它在windows.h
中定义。但是,正如其他人所说的那样,您不应该自己在私有头文件中定义它,因为不能保证定义会随着时间的推移保持不变。这可能会导致一些非常愚蠢的错误,这种类型有资格出现在Daily WTF上。
Mat's answer是100%正确的,既不是TRUE
或FALSE
是由C或C++标准定义的。但是,它们都是由Windows API严格定义的,并保证不会更改。使用它们不会产生真正的跨平台,严格符合标准的C++代码,但编写Windows应用程序时很少担心,因为它们都不会调用windows.h
中的任何其他函数。
@cody:是的,我使用的是Window应用程序...所以我使用假和真..其与布尔类型的工作... – RidaSana 2011-04-14 13:16:57
@Cody :关于bool和BOOL的问题的第二部分呢? – RidaSana 2011-04-14 13:21:29
@小姐:我补充说,在我的答案更新。简单地说,'bool'是C++标准中定义的布尔类型。它适用于小写的'true'和'false'关键字。 'BOOL'是一个整数类型,由'windows.h'定义,设计用于处理大写的'TRUE'和'FALSE'。容易记住,因为这些情况与每个组匹配。 – 2011-04-14 13:23:01
FALSE
未在标准中定义。只有false
是。 true
和false
被称为“Boolean litterals”(并且是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 1
预期。以任何方式,FALSE
都不是特权符号。
但FALSE和假返回0 ..这意味着两种类型都是bool ..右 – RidaSana 2011-04-14 13:07:42
不在标准C++中。可以定义“TRUE”和“FALSE”(通常作为宏,有时也可以作为enum的值),但是你不能依赖它。以Linux上的'GCC'为例,'bool something = FALSE;'是编译时错误,因为未定义'FALSE'。当定义'FALSE'时,通常将其定义为'0'或'false' - 但这不是您应该依赖的。依靠标准。 – Mat 2011-04-14 13:09:40
关于bool和BOOL的问题的第二部分呢? – RidaSana 2011-04-14 13:21:46
++,假预处理宏是一个内置在文字表示假值布尔类型(其他可能的值表示与该文字真)
FALSE是它的#define定义可能取决于平台,但通常为0
表示false和FALSE都是布尔类型... FALSE表示0,但false也应该为0,因为它的布尔类型.. ..is't – RidaSana 2011-04-14 13:05:14
false不计算为0,但强制为0(或者如果您愿意,则转换为int,例如当int被隐式转换为浮点数时)。预处理器将FALSE重写为0。请注意,FALSE也可能由false定义,这取决于平台。 – 2011-04-14 13:19:29
@Miss:不,'FALSE'可能是一个布尔类型,但通常它是一个整型。您可以将它用作布尔值,但它仍然是不可或缺的。例如,当涉及模板演绎和重载函数解析时,这非常重要。如果FALSE扩展为0,'f(false)'和'f(FALSE)'可以调用两个完全不同的函数。 – 2011-04-14 13:19:59
不要使用FALSE
。正如其他人所说的那样,这是一个对0进行宏观评估的结果。我听说过有人离开公司并将(#define FALSE 1
)随机放置在代码库中的故事。一个肯定的方式来肆虐。因为它是C++标准的一部分,所以坚持使用false
。
好像很容易固定,如果你原来的定义包括'的#ifdef FALSE和#undef FALSE' – 2011-04-14 13:16:14
只要记住布尔真正意义上的真假。他们总是会是整数(0,1)。编译器可能无法识别它,但它们将始终作为整数存储并通过CPU运行。调试器将显示这一点。它是否处于上限并不重要,因为它的实施或使用应该没有什么不同。如果你的编译器有一些宏写成既支持大小写又支持真假,那么很好,但它只是为了满足你的需求。就像所有其他类型一样。
有关Windows API的重要说明:尽管返回类型定义为BOOL
,但某些WIndows库函数会返回任意整数值。最好不要将BOOL
与TRUE
进行比较。使用
bSomeVal != FALSE instead.
这是在Windows下吗?然后它是从C时间剩余的时间,它没有真正的布尔值,并且FALSE被定义为0. – RedX 2011-04-14 12:59:34
@RedX:你的意思是FALSE由布尔值定义,那么假? – RidaSana 2011-04-14 13:00:58
不,'FALSE'是这样定义的:'#define FALSE(0)' – 2011-04-14 13:33:59