在 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
作为输出,前两种方法更可取,而当我们想要一些专门的输出而不仅仅是真或假时,第三种方法是首选。
相关文章
如何在 C++ 中实现毫秒级的睡眠
发布时间:2024/01/02 浏览次数:124 分类:C++
-
本文介绍了在 C++ 中使用不同方法暂停程序执行,实现睡眠的方法。本文介绍了在 C++ 中睡眠毫秒的方法。使用 std::this_thread::sleep_for 方法在 C++ 中睡眠
如何在 C++ 中将双精度数四舍五入到整数上
发布时间:2024/01/02 浏览次数:88 分类:C++
-
本文演示了如何在 C++ 中把双精度数四舍五入到整数中。本文将为大家讲解几种在 C++ 中如何将双精度数四舍五入为整数的方法。使用 round() 函数将双精度数四舍五入到整数
如何在 C++ 中以毫秒为单位获取时间
发布时间:2024/01/02 浏览次数:60 分类:C++
-
本文介绍了如何在 C++ 中获取以毫秒为单位的时间。本文将介绍多种 C++ 方法,介绍如何以毫秒为单位获取时间。
如何在 C++ 中把 Char 数组转换为 Int
发布时间:2024/01/02 浏览次数:90 分类:C++
-
本文演示了在 C++ 中把 char 数组转换为 int 类型的方法。本文将介绍将 char 数组转换为 int 类型的 C++ 方法。使用 std::strtol 函数将 char 数组转换为 int 类型
如何在 C++ 中将 ASCII 码转换为字符
发布时间:2024/01/02 浏览次数:183 分类:C++
-
本文介绍了在 C++ 中如何将 ASCII 值转换为 char 的方法。本文将演示关于如何在 C++ 中把 ASCII 值转换为字符的多种方法。在 C++ 中使用赋值运算符将 ASCII 值转换为字符
如何在 C++ 中把十进制转换为二进制
发布时间:2024/01/02 浏览次数:71 分类:C++
-
本文介绍如何在 C++ 中把十进制数转换成二进制数。本文将介绍几种在 C++ 中如何将十进制数转换为二进制表示的方法。在 C++ 中使用自定义定义的函数将十进制数转换为二进制数
如何在 C++ 中把枚举型转换为字符串
发布时间:2024/01/02 浏览次数:138 分类:C++
-
本文演示了如何在 C++ 中把枚举转换为字符串。本文将解释几种在 C++ 中把枚举类型转换为 string 变量的方法。使用 const char*数组将枚举类型转换为字符串
在 C++ 创建一个字典
发布时间:2024/01/02 浏览次数:191 分类:C++
-
本文介绍了如何在 C++ 中创建一个字典。使用初始化列表构造函数在 C++ 中创建字典 在 C++ 标准容器库中,有一个名为 std::map 的字典,它实现了具有唯一键的排序键值对。
如何在 C++ 中将文本追加到文件
发布时间:2024/01/02 浏览次数:95 分类:C++
-
本文介绍了如何用 C++ 将文本追加到文件中的方法。使用 std::ofstream 和 open() 方法将文本追加到文件中