4-9 布尔值
在现实生活中,人们常会问或被问到能用“是”或“否”回答的问题。“苹果是水果吗?”是。“你喜欢芦笋吗?”不。
现在考虑一个类似的陈述,可以用“真”或“假”回答:“苹果是水果”。这显然是真。再比如“我喜欢芦笋”。绝对错误(呕!)。
这类仅有两种可能结果的句子——是/真,或否/假——如此普遍,以至于许多编程语言都为此专门设计了数据类型。这种类型被称为布尔类型Boolean(注:英语中“Boolean”采用首字母大写,因其命名源自发明者乔治·布尔)。
布尔变量
布尔变量是只能取两个可能值的变量:true(真)和 false(假)。
声明布尔变量时,我们使用关键字 bool。
bool b;
要初始化布尔变量或为其赋值为真或假,我们使用关键字 true 和 false。
bool b1 { true };
bool b2 { false };
b1 = false;
bool b3 {}; // default initialize to false
正如一元减运算符(-)unary minus operator (-)可用于将整数变为负数,逻辑非运算符(!)ogical NOT operator (!)可用于将布尔值从真翻转为假,或从假翻转为真:
bool b1 { !true }; // b1 will be initialized with the value false
bool b2 { !false }; // b2 will be initialized with the value true
布尔值在布尔变量中实际并未以“true”或“false”的形式存储。它们以整数形式存储:true 存储为整数 1,false 存储为整数 0。同样地,当布尔值被评估时,它们实际评估的结果并非“true”或“false”,而是整数 0(false)或 1(true)。由于布尔值存储整数值,因此被视为整数类型。
打印布尔值
当我们打印布尔值时,std::cout 会将 false 打印为 0,将 true 打印为 1:
#include <iostream>
int main()
{
std::cout << true << '\n'; // true evaluates to 1
std::cout << !true << '\n'; // !true evaluates to 0
bool b {false};
std::cout << b << '\n'; // b is false, which evaluates to 0
std::cout << !b << '\n'; // !b is true, which evaluates to 1
return 0;
}
输出:

使用 std::boolalpha 打印 true 或 false
若希望 std::cout 输出 true 或 false 而不是 0 或 1,可输出 std::boolalpha。此操作本身不会输出任何内容,但会改变 std::cout 输出布尔值的方式。
示例如下:
#include <iostream>
int main()
{
std::cout << true << '\n';
std::cout << false << '\n';
std::cout << std::boolalpha; // print bools as true or false
std::cout << true << '\n';
std::cout << false << '\n';
return 0;
}
这将输出:

你可以使用 std::noboolalpha 重新关闭它。
整数到布尔值的转换
使用统一初始化时,可通过整数字面量 0(表示 false)和 1(表示 true)初始化变量(但您应优先使用 false 和 true 进行初始化)。其他整数字面量将导致编译错误:
#include <iostream>
int main()
{
bool bFalse { 0 }; // okay: initialized to false
bool bTrue { 1 }; // okay: initialized to true
bool bNo { 2 }; // error: narrowing conversions disallowed
std::cout << bFalse << bTrue << bNo << '\n';
return 0;
}

然而,在任何可以将整数转换为布尔值的上下文中,整数 0 将转换为 false,而其他任何整数都将转换为 true。
#include <iostream>
int main()
{
std::cout << std::boolalpha; // print bools as true or false
bool b1 = 4 ; // copy initialization allows implicit conversion from int to bool
std::cout << b1 << '\n';
bool b2 = 0 ; // copy initialization allows implicit conversion from int to bool
std::cout << b2 << '\n';
return 0;
}
这将输出:

注意:bool b1 = 4; 可能引发警告。若出现此情况,您需要禁用将警告视为错误的设置才能编译该示例。
输入布尔值
使用std::cin输入布尔值有时会让新手程序员感到困惑。
请看以下程序:
#include <iostream>
int main()
{
bool b{}; // default initialize to false
std::cout << "Enter a boolean value: ";
std::cin >> b;
std::cout << "You entered: " << b << '\n';
return 0;
}


等等,什么?
默认情况下,std::cin 仅接受数值输入作为布尔变量:0 表示假,1 表示真。任何其他数值都将被解释为真,并导致 std::cin 进入失败模式。任何非数值都将被解释为假,并导致 std::cin 进入失败模式。
相关内容
我们在第9.5课中讨论了失败模式(以及如何摆脱这种状态)——std::cin与处理无效输入。
在此情况下,由于输入的是 true,std::cin 悄然失败并将 b 设为 false。因此,当 std::cout 输出 b 的值时,显示的是 0。
要使 std::cin 能接受 false 和 true 作为输入,必须先向 std::boolalpha 输入:
#include <iostream>
int main()
{
bool b{};
std::cout << "Enter a boolean value: ";
// Allow the user to input 'true' or 'false' for boolean values
// This is case-sensitive, so True or TRUE will not work
std::cin >> std::boolalpha;
std::cin >> b;
// Let's also output bool values as `true` or `false`
std::cout << std::boolalpha;
std::cout << "You entered: " << b << '\n';
return 0;
}

然而,当启用 std::boolalpha 输入时,数值将不再被接受(它们会被评估为 false,并导致 std::cin 进入失败模式)。
警告
启用 std::boolalpha 输入模式后,系统仅接受小写的 false 或 true。包含大写的变体将不被接受。0 和 1 同样不再被接受。
请注意,我们使用 std::cin >> std::boolalpha; 输入布尔值 true 或 false,并使用 std::cout << std::boolalpha; 输出布尔值 true 或 false。这些是独立的控制选项,可分别通过 std::boolalpha 启用或通过 std::noboolalpha 禁用。
布尔返回值
布尔值常被用作函数的返回值,用于检查某项是否为真。此类函数通常以 is(如 isEqual)或 has(如 hasCommonDivisor)开头命名。
请看以下示例,它与上述示例非常相似:
#include <iostream>
// returns true if x and y are equal, false otherwise
bool isEqual(int x, int y)
{
return x == y; // operator== returns true if x equals y, and false otherwise
}
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; // print bools as true or false
std::cout << x << " and " << y << " are equal? ";
std::cout << isEqual(x, y) << '\n'; // will return true or false
return 0;
}
以下是该程序两次运行的输出结果:


这是如何实现的?首先我们读取x和y的整数值。接着,表达式isEqual(x, y)被求值。在第一次运行时,这会调用isEqual(5, 5)函数。该函数内部执行 5 == 5 运算,产生 true 值。true 值被返回给调用方,由 std::cout 进行打印。第二次运行时,isEqual(6, 4) 调用返回 false 值。
布尔值需要稍加适应,但一旦理解其本质,其简洁性便令人耳目一新!布尔值在语言中占据重要地位——你最终使用它们的频率将超过所有其他基本类型之和!
我们将在下一课继续探索布尔值。

浙公网安备 33010602011771号