发布网友
共3个回答
热心网友
操纵符 setiosflags 隶属于 <iomanip>,另有 resetiosflags,你可以把它们看做是对控制标志置位复位操作。我们想把 1 改成 2,直接置位如 (1|2) 是不对的,需要先复位再置位 ((1&~3)|2),同理,在使用 setiosflags 前要先使用 resetiosflags 清除旧有相应信息。严谨的写法为:
cout << resetiosflags( ios_base::hex为表明观点才写为如上形式,其实应该是如下:
cout << resetiosflags( ios_base::basefield )其中 ios_base::basefield 等于 (ios_base::hex | ios_base::dec | ios_base::oct)。
之所以你的前一种写法得到那样的结果,是因为你在设置进制前没有清除原有进制信息,而在你所用的开发环境中,原有进制信息(hex,dec,oct)跟 showbase 信息有某种关联,于是因为不严谨的写法而得出那样的结果。
至于你后一种写法的正确,是因为:
cout << hex;等效于:
cout << resetiosflags( ios_base::basefield )它在设置新进制信息前先清除了原有的进制信息,最后才正确。
看上去很麻烦,但这才够严谨,否则,因为实现机理的不同,你会在不同的开发环境得到各种诡异的结果。
热心网友
hex的定义是 setf(ios_base::hex,ios_base::basefield)与ios_base::hex是不同的 , 最新版C++的iostream库中,ios_base::hex,ios_base::oct,ios_base::dec这类格式操作符是要先清除基信息后在使用,setf(ios_base::hex,ios_base::basefield)的意思就是先清除基信息并设置十六进制格式
热心网友
方法一:
std::cout.flags ( std::ios::right | std::ios::hex | std::ios::showbase );方法二:
std::cout << std::hex << std::setiosflags (std::ios::showbase | std::ios::uppercase) << 20 << std::endl;