在 C++ 中打印布尔值

Suraj P 2023年10月12日
  1. 布尔值在 C++ 中为真/假
  2. 通过在 C++ 中添加三元语句以打印布尔值来修改 printf()
  3. cout 中使用 std::boolalpha 在 C++ 中打印布尔值
  4. 使用 std::numpunc 的自定义 Facet 在 C++ 中打印布尔值
  5. 结论
在 C++ 中打印布尔值

当我们尝试在 C++ 中打印布尔值时,它们会被 std::cout 打印为 01,但有时最好以 truefalse 的形式查看输出。本文介绍如何在 C++ 中以文本形式打印布尔值。

布尔值在 C++ 中为真/假

假设我们在调试时通读了一行又一行的代码和日志文件,现在在大量错误和数字中很容易错过 01。所以最好将布尔值打印为 true/false

我们将看到实现这一目标的三种不同方法。

通过在 C++ 中添加三元语句以打印布尔值来修改 printf()

最简单的方法是在 printf() 中稍作修改,可以打印 truefalse。使用 printf() 打印 bool 时,我们必须使用格式为 %d,因为 bool 值没有特定参数。

由于 bool 比 int 短,因此当在 printf() 语句中传递时,它被提升为 int。但这会打印普通的旧 01,因此我们通过添加三元 if-statement 并将格式说明符更改为%s 来进行修改,我们得到我们想要的 truefalse 输出。

示例代码:

#include <iostream>
using namespace std;

int main() {
  printf("boolean true: %d\n", true);
  printf("boolean false: %d\n", false);

  // modified printf()
  printf("boolean true: %s\n", true ? "true" : "false");
  printf("boolean false: %s\n", false ? "true" : "false");
}

输出:

boolean true: 1
boolean false: 0
boolean true: true
boolean false: false

这种方法的问题是,当源代码文件变得大而复杂时,它会妨碍可读性。

cout 中使用 std::boolalpha 在 C++ 中打印布尔值

std::boolalpha 可以在 <iomanip> 头文件中找到,它适用于输入和输出流函数。标准流有一个 boolalpha 标志,它决定了在屏幕上打印的内容。

如果它设置为 true,它会显示布尔值的文本形式,即 truefalse,但是当它设置为 false 时,我们得到的布尔输出仅为 01

例子:

#include <iostream>
using namespace std;

int main() {
  cout << "when boolalpha flag is off\n";
  cout << "true: " << true << endl;
  cout << "false: " << false << endl;

  cout << "when boolalpha flag is on\n";
  cout << boolalpha << "true: " << true << endl;
  cout << boolalpha << "false: " << false << endl;
  cout << noboolalpha;
}

输出:

when boolalpha flag is off
true: 1
false: 0
when boolalpha flag is on
true: true
false: false

std::boolalpha 是打印 truefalse 作为输出的最佳方法之一,但它有一些缺点。首先,我们应该在通过 std::noboolalpha 使用后关闭 boolalpha 标志。

另一个问题是,如果我们想用日语或其他语言编写代码,并且我们确实想要打印"hai"(日语中为真)或"nai"(日语中为假)而不是 truefalse,该怎么办? ,或者如果我们想将单词大写为 TrueFalse,我们不能单独使用 std::boolalpha 来做任何这些。

使用 std::numpunc 的自定义 Facet 在 C++ 中打印布尔值

如上一段所述,如果我们想要打印除 truefalse 或大写或本地化输出之外的内容怎么办。这可以使用 std::numpunct 的自定义 facet 来完成。

facet 是描述与特定文化方面相关的语言环境特征集的类。流输入和输出操作使用 std::numpunctstd::numgetstd::numput 来解析数字输入和格式化数字输出。

std::numpunctfacet 封装了数字标点首选项。我们可以通过覆盖 std::numpunct 中的函数 do_truename()do_falsename() 来指定我们想要在 std::boolalpha 标志处于活动状态时返回的字符串。

在此之后,使用 std::locale 对象以及使用 std::cout.imbue() 我们可以替换当前的语言环境。

示例代码:

#include <ios>
#include <iostream>
#include <locale>
using namespace std;

class japanese_bool : public std::numpunct<char> {
 protected:
  std::string do_truename() const override { return "Hai"; }
  std::string do_falsename() const override { return "NAI"; }
};

int main() {
  cout.imbue(std::locale(std::locale(), new japanese_bool));
  cout << std::boolalpha;
  cout << "Japanese true : " << true << "\n";
  cout << "Japanese false : " << false << "\n";
  cout << noboolalpha;
}

在上面的代码中,new 不是内存泄漏,japanese_bool 对象是隐式引用计数的,当 std::locale 引用超出范围时,它会自动销毁。

输出:

Japanese true : Hai
Japanese false : NAI

结论

这篇文章教给我们不同的方法来打印布尔输出为 truefalse。如果我们想要 truefalse 作为输出,前两种方法更可取,而当我们想要一些专门的输出而不仅仅是真或假时,第三种方法是首选。

作者: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub