我一直在使用操纵器一段时间而没有完全理解它们是如何工作的。
此代码:
std::cout << std::hex << std::showbase;
std::cout << std::uppercase << 77 << '\n';
std::cout << std::nouppercase << 77 << '\n';
或者这个:
std::cout << std::hex;
std::cout << std::setiosflags(std::ios::showbase | std::ios::uppercase) << 77 << '\n';
std::cout << std::nouppercase << 77 << '\n';
两者都输出:
0X4D // 'X' and 'D' uppercase
0x4d // 'x' and 'd' lowercase
但是,以下代码行中没有一行可以转换字符串&#34; abcd&#34;大写为什么呢?
std::cout << std::uppercase << "abcd" << '\n';
std::cout << std::setiosflags(std::ios::uppercase) << "abcd" << '\n';
另一个问题是,为什么showbase
和uppercase
必须在std::ios::
内std::setiosflags()
限定,并且只有std::
在该功能之外?
最后,为什么std::hex
无法在std::setiosflags()
内被接受
谢谢
答案 0 :(得分:7)
阅读std::uppercase
的文档。
允许在浮点和十六进制整数输出中使用大写字符。
std::ios_base::hex
接受了 std::setiosflags
docs中有一个示例。
以下是std::uppercase
的示例:
#include <iostream>
int main()
{
std::cout << std::hex << std::showbase
<< "0x2a with uppercase: " << std::uppercase << 0x2a << '\n'
<< "0x2a with nouppercase: " << std::nouppercase << 0x2a << '\n'
<< "1e-10 with uppercase: " << std::uppercase << 1e-10 << '\n'
<< "1e-10 with nouppercase: " << std::nouppercase << 1e-10 << '\n';
}
以下是std::setiosflags
的示例:
#include <iostream>
#include <iomanip>
int main()
{
std::cout << std::resetiosflags(std::ios_base::dec)
<< std::setiosflags( std::ios_base::hex
| std::ios_base::uppercase
| std::ios_base::showbase) << 42 << '\n';
}
定义:
std::hex
定义为std::ios_base& hex( std::ios_base& str );
std::ios_base::hex
定义为static constexpr fmtflags hex = /*...*/;
答案 1 :(得分:2)
std::uppercase
仅影响转换为十六进制的结果。
std::hex
是一个操纵器对象,而setiosflags
期望通过组合各个位形成一个整数。或者,更确切地说,是以这种方式表现的类型。您可以使用std::hex
来代替std::ios_base::hex
(类型错误)。
答案 2 :(得分:0)
我想加2美分。我在代码的开头编写了以下两行代码,以使生活更轻松:
const long base = std::ios::showbase;
const long upper = std::ios::uppercase;
然后使用常量而不是乏味的代码。