在 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
作为输出,前两种方法更可取,而当我们想要一些专门的输出而不仅仅是真或假时,第三种方法是首选。