在 setiosflags 函数中使用十六进制标志

Using hex flag inside setiosflags function

int a=60;
cout<<setiosflags(ios::hex|ios::showbase|ios::uppercase);
cout<<a<<endl;

上面的代码不起作用,但如果我使用

cout<<hex

然后

cout<<setiosflags(ios::showbase|ios::uppercase)

那么它正在工作

为什么?以及我怎么知道哪个可以在 setiosflags() 中使用?

您需要在调用 setiosflags 之前调用 resetiosflags。这样做的原因是 setiosflags(ios::hex|ios::showbase|ios::uppercase) 只是将这些标志附加到流中,就好像调用 setf 一样,并且在流中给出了冲突的标志。使用

std::cout << std::resetiosflags(std::ios_base::dec)
          << std::setiosflags(std::ios::hex|std::ios::showbase|std::ios::uppercase)
          << a << endl;

将使其正确显示 a

第一个版本需要先清除std::ios::dec,否则优先:

std::cout << resetiosflags (std::ios::dec);

您可以通过使用适当的掩码调用 setf 来一次完成此操作,例如:

std.cout.setf (std:ios.hex, std.ios.basefield);

cppreference 中所述,std::cout << hex 会为您完成此操作。