我在写一些代码时遇到了这个疑问。 'bool'是C ++标准中定义的基本数据类型还是编译器提供的某种扩展?我有这个疑问,因为Win32有'BOOL',这只不过是一个长期的typedef。如果我做这样的事情会发生什么:
int i = true;
是否“始终”保证变量i的值为1,还是取决于我使用的编译器?对于一些接受BOOL作为参数的Win32 API,如果我传递bool变量会发生什么?
答案 0 :(得分:75)
bool是C ++中的基本数据类型。将true
转换为整数类型将产生1,转换false
将产生0(4.5 / 4和4.7 / 4)。在C中,直到C99,没有bool数据类型,人们做了像
enum bool {
false, true
};
Windows API也是如此。从C99开始,我们将_Bool
作为基本数据类型。包括stdbool.h
将 typedef #define
添加到bool
并提供常量true
和false
。由于与现有代码的兼容性问题,他们没有使bool成为基本数据类型(因此也就是关键字)。
答案 1 :(得分:8)
是的,bool是一种内置类型。
WIN32是C代码,而不是C ++,而C没有bool,因此它们提供了自己的typedef BOOL。
答案 2 :(得分:5)
C ++会为你做很多自动转换 - 也就是说,如果你有一个bool
类型的变量并将其传递给期望int
的变量,它会使它成为int
}对你而言 - 0
false
和1
true
。
我没有我的标准,看看是否有保证,但我使用的每个编译器都这样做(所以可以假设它总是有效)。
然而,依靠这种转换是一个坏主意。如果添加了重载int
签名等的新方法
答案 3 :(得分:2)
供进一步参考:Boolean Datatype
答案 4 :(得分:1)
C意味着高于汇编语言。 C if语句实际上只是“branch-if-zero”的语法糖,所以布尔值作为独立数据类型的想法在当时是一个外国概念。 (1)
即使是现在,C / C ++布尔值通常只是单字节数据类型的别名。因此,它实际上更像是一个专用标签,而不是一个独立的数据类型。
(1)当然,现代编译器在处理if语句时要先进一步。这是从C作为新语言的角度出发的。
答案 5 :(得分:0)
Turbo c和c ++编译器不支持boolean(bool关键字)数据类型,但dev c ++编译器支持boolean(bool关键字)数据类型。
答案 6 :(得分:0)
是的,C++ 支持 bool 并且它是一种数据类型。 供参考 - Bool data type
答案 7 :(得分:-1)
尽管它现在是一个原生类型,它仍然在幕后定义为一个整数(我认为是int),其中文字false
为0而true
为1.但我认为所有逻辑仍然在考虑除了0之外的任何东西都是真的,因此严格来说,真正的文字可能是编译器测试某些东西是否为假的关键字。
if(someval == true){
可能转换为:
if(someval !== false){ // e.g. someval !== 0
由编译器