在 C++ 中打印布尔值
- 布尔值在 C++ 中为真/假
- 
          
            通过在 C++ 中添加三元语句以打印布尔值来修改 printf()
- 
          
            在 cout中使用std::boolalpha在 C++ 中打印布尔值
- 
          
            使用 std::numpunc的自定义 Facet 在 C++ 中打印布尔值
- 结论
 
当我们尝试在 C++ 中打印布尔值时,它们会被 std::cout 打印为 0 或 1,但有时最好以 true 或 false 的形式查看输出。本文介绍如何在 C++ 中以文本形式打印布尔值。
布尔值在 C++ 中为真/假
假设我们在调试时通读了一行又一行的代码和日志文件,现在在大量错误和数字中很容易错过 0 或 1。所以最好将布尔值打印为 true/false。
我们将看到实现这一目标的三种不同方法。
通过在 C++ 中添加三元语句以打印布尔值来修改 printf()
最简单的方法是在 printf() 中稍作修改,可以打印 true 或 false。使用 printf() 打印 bool 时,我们必须使用格式为 %d,因为 bool 值没有特定参数。
由于 bool 比 int 短,因此当在 printf() 语句中传递时,它被提升为 int。但这会打印普通的旧 0 和 1,因此我们通过添加三元 if-statement 并将格式说明符更改为%s 来进行修改,我们得到我们想要的 true 或 false 输出。
示例代码:
#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,它会显示布尔值的文本形式,即 true 或 false,但是当它设置为 false 时,我们得到的布尔输出仅为 0 和 1。
例子:
#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 是打印 true 或 false 作为输出的最佳方法之一,但它有一些缺点。首先,我们应该在通过 std::noboolalpha 使用后关闭 boolalpha 标志。
另一个问题是,如果我们想用日语或其他语言编写代码,并且我们确实想要打印"hai"(日语中为真)或"nai"(日语中为假)而不是 true 或 false,该怎么办? ,或者如果我们想将单词大写为 True 或 False,我们不能单独使用 std::boolalpha 来做任何这些。
使用 std::numpunc 的自定义 Facet 在 C++ 中打印布尔值
如上一段所述,如果我们想要打印除 true 或 false 或大写或本地化输出之外的内容怎么办。这可以使用 std::numpunct 的自定义 facet 来完成。
facet 是描述与特定文化方面相关的语言环境特征集的类。流输入和输出操作使用 std::numpunct 到 std::numget 和 std::numput 来解析数字输入和格式化数字输出。
std::numpunct 的 facet 封装了数字标点首选项。我们可以通过覆盖 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
结论
这篇文章教给我们不同的方法来打印布尔输出为 true 和 false。如果我们想要 true 或 false 作为输出,前两种方法更可取,而当我们想要一些专门的输出而不仅仅是真或假时,第三种方法是首选。
