分析 BOOL & bool

本文详细对比了C++中的BOOL与bool两种类型。介绍了两者的来历、长度、取值的不同,并提醒开发者在使用过程中避免混淆。

一、BOOL 和 bool 来历

在C语言中,没有bool和BOOL这两个关键字的,如果要使用,除非你自己定义。但是在coder的日常使用中,有太多的应用场景需要判断是是非非,所有coder需要经常定义这个表征是非的“关键字”。能与时俱进的语言才是有活力的语言。在C++中引入了bool关键字,但是大家平常也会看到或者使用BOOL,这又是怎么回事呢?答曰:这是微软自己定义的。就拿MFC来说,在头文件WTYPES.H和WINDEF.H中的定义如下:

typedef long BOOL; //WTYPE.H
typedef int    BOOL; //WINDEF.H

       从上面的分析可以看出,bool是真正的布尔型,而BOOL不是真正意义上的布尔型,准确的说应该是整形。


二、BOOL 和 bool 的长度

        bool型的长度是1个字节,而BOOL型的长度是4个字节(不同的编译器,分配的字节数可能有出入。这里以MFC为例)。

	bool bIsOk = false;
	BOOL bIsRunning = FALSE;
	
	int nSize = sizeof(bIsOk);
	int nLen = sizeof(bIsRunning);

         可以在内存看到,变量nSize和nLen的长度分别是1 和 4.


三、取值不同

        bool的取值为true,或者false,是1或者0,而BOOL的取值为TRUE或者FALSE,,表示非零,或者零。


四、注意

     在使用的过程切勿将两者混用,比如bool型的赋值为TRUE或者FALSE,而BOOL型的赋值为true或者false,这些都是不行的。




在 C++ 中,`bool` 和 `bool&` 是两种不同类型的声明,它们分别表示“布尔值”和“布尔值的引用”。它们在语义、用途以及性能方面存在显著差异。 ### `bool` 类型 `bool` 是 C++ 内建的布尔类型,用于表示逻辑值 `true` 或 `false`。它通常用于条件判断、循环控制以及函数返回值等场景。当一个变量被声明为 `bool` 时,它会在内存中分配一个字节(或更多,取决于对齐方式)来存储布尔值。 例如: ```cpp bool flag = true; ``` 此声明创建了一个布尔变量 `flag`,它拥有自己的存储空间,并且可以被赋值、读取和修改。 ### `bool&` 类型 `bool&` 表示对一个 `bool` 类型变量的引用。引用本质上是一个别名,它并不分配新的存储空间,而是绑定到一个已有的变量上。通过引用操作,可以修改原始变量的值。 例如: ```cpp bool a = true; bool& refA = a; refA = false; ``` 上述代码中,`refA` 是 `a` 的引用,对 `refA` 的赋值等价于对 `a` 的赋值。因此,执行 `refA = false;` 后,`a` 的值也变为 `false`。 使用引用的一个常见场景是在函数参数传递中,以避免不必要的拷贝操作,从而提高性能。例如: ```cpp void toggleFlag(bool& flag) { flag = !flag; } ``` 该函数接受一个 `bool&` 参数,可以直接修改调用者提供的布尔变量的值。 ### 区别总结 | 特性 | `bool` | `bool&` | |--------------|-----------------------------------|-------------------------------------| | 类型 | 值类型 | 引用类型 | | 存储空间 | 分配新的内存空间 | 不分配新内存,绑定到已有变量 | | 修改行为 | 修改不会影响其他变量 | 修改会影响原始变量 | | 函数参数传递 | 会拷贝原始值,函数内修改不影响原值 | 不会拷贝,函数内修改影响原值 | | 性能 | 可能涉及拷贝开销 | 避免拷贝,提高性能 | ### 示例代码 以下是一个展示 `bool` 和 `bool&` 差异的示例程序: ```cpp #include <iostream> void modifyBool(bool b) { b = !b; std::cout << "Inside modifyBool: " << std::boolalpha << b << std::endl; } void modifyBoolRef(bool& b) { b = !b; std::cout << "Inside modifyBoolRef: " << std::boolalpha << b << std::endl; } int main() { bool flag = true; std::cout << "Original flag: " << std::boolalpha << flag << std::endl; modifyBool(flag); std::cout << "After modifyBool: " << std::boolalpha << flag << std::endl; modifyBoolRef(flag); std::cout << "After modifyBoolRef: " << std::boolalpha << flag << std::endl; return 0; } ``` 输出结果: ``` Original flag: true Inside modifyBool: false After modifyBool: true Inside modifyBoolRef: false After modifyBoolRef: false ``` 从输出可以看出,`modifyBool` 函数中的修改不会影响原始变量 `flag`,而 `modifyBoolRef` 函数中的修改则会影响原始变量。 ### 总结 `bool` 和 `bool&` 在语义和行为上有本质区别。`bool` 是值类型,表示一个独立的布尔值;而 `bool&` 是引用类型,是对已有布尔值的别名。在函数参数传递和需要修改原始变量的场景中,使用 `bool&` 更加高效和实用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值