假与假的区别是什么?
What is the difference between false and FALSE?
在许多程序中,我看到带有标识符FALSE
和false
的语句。它们在c++环境中有什么区别吗?
在一些程序中,我看到了bool
和BOOL
。这两者的区别是什么?
谁能给我解释一下这些标识符的区别?谢谢。
如果包含windows.h
,则FALSE
的#定义为0。TRUE
#定义为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
中定义的。但是您不应该像其他人提到的那样,在专有的头文件中自己定义它,因为不能保证该定义随时间保持不变。这可能会导致一些非常愚蠢的错误,这些错误有资格出现在每日WTF上。
Mat的答案是100%正确的,TRUE
或FALSE
都不是由C或c++标准定义的。但是,它们是由Windows API严格定义的,并且保证不会更改。使用它们不会产生真正跨平台的、严格符合标准的c++代码,但在编写Windows应用程序时,这很少是一个问题,因为它们也不会调用windows.h
中的任何其他函数。
FALSE
在标准中没有定义。只有false
是。true
和false
被称为"布尔字面值",是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
在任何方面都不是特权符号
在c++中,false是布尔类型的内置文字,表示false值(其他可能的值用文字true表示)
FALSE是一个#define,其定义可能取决于平台,但通常为0。
false
是一个c++关键字。
FALSE在c++标准中没有定义。但是大多数编译器都将FALSE定义为预处理器宏,值为0。
记住真布尔值和假布尔值的含义。它们总是整数(0,1)编译器可能无法识别它,但它们将始终作为整数存储并在CPU中运行。调试器将显示这一点。它是否大写并不重要,因为它的实现或用法应该没有什么不同。如果你的编译器写了一些宏来支持大写和小写的true和false,那么很好,但这只是为了满足你的需要。就像其他类型一样
关于Windows API的重要注意事项:一些Windows库函数返回任意整数值,尽管返回类型定义为BOOL
。最好不要将BOOL
与TRUE
进行比较。使用
bSomeVal != FALSE instead.
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 这些情况有什么区别?我怎么知道什么是临时对象?
- 如果我提前将参数声明为变量而不是将它们内联写入函数调用,那有什么区别(在内存方面)?
- C++和Python之间平等含义的区别的根源是什么?
- 尾随空格是什么意思,它和空白有什么区别?
- 调试构建和发布构建、区别和用途是什么意思
- std::ifstream::in 和 std::ios::in 有什么区别?(显然是 C++ 中 std::ifstr
- 在 C++ STL 的比较函数中使用"<="符号而不是"<"符号有什么区别?
- 在头中声明变量而不是在源文件(cpp/h)中声明变量有什么区别
- "Thing thing;"和"Thing thing = Thing();"有什么区别,什么时候应该使用一个而不是另一个?
- 如果 a 是 cv::Mat 和 cv::Mat b=a.row(1),那么两个 cv::Mat 实例有什么区别
- 如果f是双精度数,f+=1和f+=1.0有什么区别吗?
- char和CString的区别和关系是什么?
- 那么,是什么区别了template(c.end(),_1)和template_back(_1)呢
- C++:按变量值而不是数字移位 ->有什么区别?