C++布尔值完全指南:类型、操作与最佳实践

在现实生活中,我们经常会被问到只能用"是"或"否"来回答的问题,比如:“苹果是水果吗?"——是的;“你喜欢芦笋吗?"——不喜欢。

类似地,考虑一句可以用"真"或"假"来回答的话:“苹果是水果。” 这显然是真的。再比如:“我喜欢芦笋。"——绝对是假的(呃,太难吃了!)

这类只有两种可能结果(是/否,或 真/假)的问题非常常见,因此,许多编程语言都专门为这种情况提供了一种特殊的类型:布尔类型(Boolean type)

注:Boolean 一词以大写书写,是为了纪念其发明者乔治·布尔(George Boole)。

布尔变量的基础

布尔变量只能拥有两种取值:true(真) 和 false(假)。

在 C++ 中,我们用 bool 关键字来声明布尔变量:

bool b;

要初始化或赋值给布尔变量,可以直接使用 truefalse

bool b1 { true };
bool b2 { false };
b1 = false;
bool b3 {}; // 默认初始化为 false

就像一元负号运算符(-)可以用来把整数变为负数一样,逻辑非运算符(! 可以用来翻转布尔值:

bool b1 { !true };  // b1 将被初始化为 false
bool b2 { !false }; // b2 将被初始化为 true

布尔值在内存中并不是以 truefalse 的字样存储的,而是以整数形式存储:true 存为 1false 存为 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 输出 truefalse(而不是 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

布尔值与整数的转换

使用统一初始化时,你可以用 01 来初始化布尔变量(尽管更推荐直接用 falsetrue):

#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 表示 false
  • 1 表示 true
  • 其他数字或文本会导致输入失败,变量保持未改变(默认为 false)

使用std::boolalpha处理文本输入

想让用户可以输入 truefalse,需要先启用 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 后,只接受小写 truefalse
  • TrueTRUE01 都会导致失败
  • std::cin >> std::boolalphastd::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 类型只有两个取值:truefalse
  • 它们本质上是整数类型:true = 1false = 0
  • 使用 std::boolalpha 控制输入输出的格式
  • 布尔值在逻辑判断和控制流程中用途极广,是最常用的基本类型之一!

下一课我们将继续深入探索布尔值的更多用法。


是否需要我继续翻译下一篇文章,或者需要整理成 Markdown 文件?

关注公众号,回复"cpp-tutorial"

可领取价值199元的C++学习资料

公众号二维码

扫描上方二维码或搜索"cpp-tutorial"