在现实生活中,我们经常会被问到只能用"是"或"否"来回答的问题,比如:“苹果是水果吗?"——是的;“你喜欢芦笋吗?"——不喜欢。
类似地,考虑一句可以用"真"或"假"来回答的话:“苹果是水果。” 这显然是真的。再比如:“我喜欢芦笋。"——绝对是假的(呃,太难吃了!)
这类只有两种可能结果(是/否,或 真/假)的问题非常常见,因此,许多编程语言都专门为这种情况提供了一种特殊的类型:布尔类型(Boolean type)。
注:Boolean 一词以大写书写,是为了纪念其发明者乔治·布尔(George Boole)。
布尔变量的基础
布尔变量只能拥有两种取值:true
(真) 和 false
(假)。
在 C++ 中,我们用 bool
关键字来声明布尔变量:
bool b;
要初始化或赋值给布尔变量,可以直接使用 true
或 false
:
bool b1 { true };
bool b2 { false };
b1 = false;
bool b3 {}; // 默认初始化为 false
就像一元负号运算符(-
)可以用来把整数变为负数一样,逻辑非运算符(!
) 可以用来翻转布尔值:
bool b1 { !true }; // b1 将被初始化为 false
bool b2 { !false }; // b2 将被初始化为 true
布尔值在内存中并不是以 true
或 false
的字样存储的,而是以整数形式存储:true
存为 1
,false
存为 0
。
因此,布尔类型也被视为整数类型的一种。
布尔值的输出操作
默认情况下,std::cout
打印布尔变量时,会输出整数:
#include <iostream>
int main()
{
std::cout << true << '\n'; // 输出 1
std::cout << !true << '\n'; // 输出 0
bool b {false};
std::cout << b << '\n'; // 输出 0
std::cout << !b << '\n'; // 输出 1
return 0;
}
输出为:
1
0
0
1
使用std::boolalpha格式化输出
如果你希望 std::cout
输出 true
或 false
(而不是 1 或 0),可以使用输出操纵符 std::boolalpha
:
#include <iostream>
int main()
{
std::cout << true << '\n';
std::cout << false << '\n';
std::cout << std::boolalpha; // 启用布尔值文字输出
std::cout << true << '\n';
std::cout << false << '\n';
return 0;
}
输出为:
1
0
true
false
若想恢复为 0 和 1 的输出格式,可使用 std::noboolalpha
。
布尔值与整数的转换
使用统一初始化时,你可以用 0
和 1
来初始化布尔变量(尽管更推荐直接用 false
和 true
):
#include <iostream>
int main()
{
bool bFalse { 0 }; // 合法,值为 false
bool bTrue { 1 }; // 合法,值为 true
bool bNo { 2 }; // 错误:2 是非法的布尔初始化(narrowing conversion)
std::cout << bFalse << bTrue << bNo << '\n'; // 编译不过
return 0;
}
但在其他允许隐式转换的上下文中,任何 非零整数会被视为 true
,而 0
被视为 false
:
#include <iostream>
int main()
{
std::cout << std::boolalpha;
bool b1 = 4; // 隐式转换为 true
std::cout << b1 << '\n';
bool b2 = 0; // 转换为 false
std::cout << b2 << '\n';
return 0;
}
输出为:
true
false
⚠️ 注意:像
bool b1 = 4;
这样的写法可能会触发编译器警告(尤其在启用严格模式时)。
布尔值的输入处理
新手程序员经常在布尔输入这块出错。
考虑下面这个程序:
#include <iostream>
int main()
{
bool b{}; // 默认初始化为 false
std::cout << "Enter a boolean value: ";
std::cin >> b;
std::cout << "You entered: " << b << '\n';
return 0;
}
当你输入 true
时,输出却是:
Enter a boolean value: true
You entered: 0
发生了什么?
默认情况下,std::cin
只接受数字形式的输入:
0
表示 false1
表示 true- 其他数字或文本会导致输入失败,变量保持未改变(默认为 false)
使用std::boolalpha处理文本输入
想让用户可以输入 true
或 false
,需要先启用 std::boolalpha
:
#include <iostream>
int main()
{
bool b{};
std::cout << "Enter a boolean value: ";
std::cin >> std::boolalpha; // 允许输入文字 true/false
std::cin >> b;
std::cout << std::boolalpha;
std::cout << "You entered: " << b << '\n';
return 0;
}
输入:
true
输出:
You entered: true
⚠️ 注意:
- 开启
std::boolalpha
后,只接受小写true
或false
True
、TRUE
、0
、1
都会导致失败std::cin >> std::boolalpha
和std::cout << std::boolalpha
是独立控制的
布尔值作为函数返回值
布尔值常用于函数返回结果,尤其是判断类函数。
这类函数通常以 is
(如 isEqual
)或 has
(如 hasPermission
)开头。
例如:
#include <iostream>
// 判断两个整数是否相等
bool isEqual(int x, int y)
{
return x == y;
}
int main()
{
std::cout << "Enter an integer: ";
int x{};
std::cin >> x;
std::cout << "Enter another integer: ";
int y{};
std::cin >> y;
std::cout << std::boolalpha;
std::cout << x << " and " << y << " are equal? ";
std::cout << isEqual(x, y) << '\n';
return 0;
}
两次运行示例:
Enter an integer: 5
Enter another integer: 5
5 and 5 are equal? true
Enter an integer: 6
Enter another integer: 4
6 and 4 are equal? false
布尔值使用总结
布尔值刚开始可能有些绕,但一旦掌握后就会发现它们十分简洁高效!
请记住以下几点:
bool
类型只有两个取值:true
和false
- 它们本质上是整数类型:
true = 1
,false = 0
- 使用
std::boolalpha
控制输入输出的格式 - 布尔值在逻辑判断和控制流程中用途极广,是最常用的基本类型之一!
下一课我们将继续深入探索布尔值的更多用法。
是否需要我继续翻译下一篇文章,或者需要整理成 Markdown 文件?