ios::fmtflags 在 C++ 中如何工作?setf() 如何工作?

How does ios::fmtflags works in C++?How setf() works?

我正在尝试了解 ios 流的格式化标志。谁能解释一下这个 cout.setf(ios::hex | ios::showbase) 是如何工作的?我的意思是 or (|) 运算符如何在两个 ios 格式的标志之间工作? 请原谅我糟糕的英语。

std::ios_base::hexstd::ios_base::showbase 都是 BitmaskType std::ios_base::fmtflags 的枚举数。 BitmaskType 通常是枚举类型,其枚举数是两个不同的幂,有点像这样:(1 << n 表示 2n)

// simplified; can also be implemented with integral types, std::bitset, etc.
enum fmtflags : unsigned {
    dec      = 1 << 0, // 1
    oct      = 1 << 1, // 2
    hex      = 1 << 2, // 4
    // ...
    showbase = 1 << 9, // 512
    // ...
};

|运算符是位或运算符,对相应的位进行或运算,所以

hex             0000 0000 0000 0100
showbase        0000 0010 0000 0000
                -------------------
hex | showbase  0000 0010 0000 0100

此技术可用于将标志组合在一起,因此位掩码中的每一位都代表一个单独的标志(设置或未设置)。然后,每个标志可以是

  • 查询到:mask & flag;

  • 设置:mask | flag;

  • 未设置:mask & (~flag).