3

一段时间以来,我一直在使用机械手,但并没有完全理解它们是如何工作的。

这段代码:

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

但是,以下代码行都不能将字符串“abcd”转换为大写。为什么?

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()

谢谢

4

3 回答 3

8

阅读std::uppercase.

允许在浮点和十六进制整数输出中使用大写字符。

std::ios_base::hex被接受,文档std::setiosflags中有一个例子。

这是示例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 = /*...*/;

于 2016-11-27T21:13:38.850 回答
2

std::uppercase只影响转换为十六进制的结果。

std::hex是一个操纵器对象,而setiosflags期望一个由单个位组合而成的整数。或者,更准确地说,是一种以这种方式表现的类型。而不是std::hex(类型错误),您可以使用std::ios_base::hex.

于 2016-11-27T21:13:20.160 回答
0

我想加我的 2 美分。我在代码的开头写了这两行代码,以使生活更轻松:

const long base = std::ios::showbase;
const long upper = std::ios::uppercase;

稍后使用常量代替繁琐的代码。

于 2019-08-30T03:27:14.663 回答