关于cin.unsetf()方法语句含义及实测效果的疑问
关于C++输入流
unsetf(ios::dec/oct/hex)的疑问解答 输入流基数标志的默认状态
默认情况下,std::cin仅设置了ios::dec(十进制)标志,ios::oct(八进制)和ios::hex(十六进制)均为未设置状态。此时输入解析规则为:无前缀数字按十进制处理,0开头按八进制,0x/0X开头按十六进制。为什么仅
unsetf(ios::dec)就生效
当你调用cin.unsetf(std::ios::dec)后,三个基数标志全部处于未设置状态,输入流会完全根据前缀自动识别基数。这种状态和默认状态的核心区别是:默认是「强制十进制为默认,但允许前缀触发其他基数」,而全unset后是「无默认基数,完全依赖前缀判断」。但无前缀的数字在两种状态下都会被解析为十进制,所以你测试时输入12仍得到12。书中注释的实际含义
书中代码同时unset三个标志的场景,是针对之前主动设置过某一基数标志的情况:- 若之前调用
cin.setf(ios::hex)强制按十六进制解析,输入12会被当成十六进制的18;调用cin.unsetf(ios::hex)后,取消强制规则,无前缀的12就会被解析为十进制的12——这就是注释“don’t assume hexadecimal (so that 12 can mean twelve)”的本意。 - 同理,
unsetf(ios::oct)是取消强制八进制的设置,避免输入12被当成八进制的10。
- 若之前调用
为什么
unsetf(ios::oct)和unsetf(ios::hex)看起来没效果
因为默认情况下这两个标志本来就是未设置的,调用unsetf对它们的状态没有任何改变。只有先主动设置过这些标志,unsetf才会体现作用。比如测试以下代码就能看到差异:int main() { std::cin.setf(std::ios::hex); // 强制按十六进制解析 int x; std::cin >> x; std::cout << x << std::endl; // 输入12会输出18 std::cin.unsetf(std::ios::hex); // 取消强制十六进制 std::cin >> x; std::cout << x << std::endl; // 输入12会输出12 }
内容的提问来源于stack exchange,提问作者a_floating_point
相关产品推荐
相关产品推荐

