为什么 cout<<hex satement 使其余部分仅以十六进制格式打印

Why cout<<hex satement makes the rest print in hex format only

本文关键字:lt 十六进制 格式 式打印 hex cout satement 为什么 余部      更新时间:2023-10-16

我有以下代码段来打印整数的十六进制值

int i=10;
cout<<hex<<i<<endl;

在控制台井上打印10 a的十六进制值

但在下一行,我需要打印另一个变量的十进制值,比如

  int j=11;
  cout<<j<<endl;

但它也打印十六进制值11,b,如果我使用cout<<dec<<j<<endl;,它打印十进制值。

我还注意到,如果以前使用cout<<hex,那么所有的cout都会打印变量的十六进制值。

所以我的问题是这是正常行为吗?如果我以前使用过<<hex一次,我需要使用<<dec吗?

是的,必须使用dec才能获得cout的十进制值,因为hex是一个"粘性"操纵器(顺便说一句,和许多其他操纵器一样)-它将一直保持到更改。

您可以编写自己的操纵器来克服"粘性"行为:

#include <iostream>
#include <iomanip>
#include <limits>
// Hex
// ============================================================================
template <typename T>
struct Hex
{
    enum { Width = (std::numeric_limits<T>::digits + 1) / 4 };
    const T& value;
    const int width;
    Hex(const T& value, int width = Width)
    : value(value), width(width)
    {}
    void write(std::ostream& stream) const {
        if(std::numeric_limits<T>::radix != 2) stream << value;
        else {
            std::ios_base::fmtflags flags = stream.setf(
                std::ios_base::hex, std::ios_base::basefield);
            char fill = stream.fill('0');
            stream << "0x" << std::setw(width) << value;
            stream.fill(fill);
            stream.setf(flags, std::ios_base::basefield);
        }
    }
};
template <typename T>
inline Hex<T> hex(const T& value, int width = Hex<T>::Width) {
    return Hex<T>(value, width);
}
template <typename T>
inline std::ostream& operator << (std::ostream& stream, const Hex<T>& value) {
    value.write(stream);
    return stream;
}

int main()
{
    unsigned short i = 0xa;
    std::cout << hex(i) << " == " << i << 'n';
    return 0;
}

cout是全局的。在操纵器中移动会修改全局的状态。如果你可以将操纵器链接在一起,cout的实例将永远不知道何时"取消设置"它。因此,它会持续存在。