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;
}

输出:

image


使用 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;
}

这将输出:

image

你可以使用 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;
}

image

然而,在任何可以将整数转换为布尔值的上下文中,整数 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;
}

这将输出:

image

注意: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;
}

image
image

等等,什么?

默认情况下,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;
}

image

然而,当启用 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;
}

以下是该程序两次运行的输出结果:

image

image

这是如何实现的?首先我们读取x和y的整数值。接着,表达式isEqual(x, y)被求值。在第一次运行时,这会调用isEqual(5, 5)函数。该函数内部执行 5 == 5 运算,产生 true 值。true 值被返回给调用方,由 std::cout 进行打印。第二次运行时,isEqual(6, 4) 调用返回 false 值。

布尔值需要稍加适应,但一旦理解其本质,其简洁性便令人耳目一新!布尔值在语言中占据重要地位——你最终使用它们的频率将超过所有其他基本类型之和!

我们将在下一课继续探索布尔值。

posted @ 2026-02-14 08:58  游翔  阅读(2)  评论(0)    收藏  举报