首页 养生问答 疾病百科 养生资讯 女性养生 男性养生

setiosflags的ios_base::hex问题

发布网友

我来回答

3个回答

热心网友

操纵符 setiosflags 隶属于 <iomanip>,另有 resetiosflags,你可以把它们看做是对控制标志置位复位操作。我们想把 1 改成 2,直接置位如 (1|2) 是不对的,需要先复位再置位 ((1&~3)|2),同理,在使用 setiosflags 前要先使用  resetiosflags 清除旧有相应信息。严谨的写法为:

cout << resetiosflags( ios_base::hex
                     | ios_base::dec
                     | ios_base::oct
                     | ios_base::showbase
                     | ios_base::uppercase )
     <<   setiosflags( ios_base::hex
                     | ios_base::showbase
                     | ios_base::uppercase )
     << 20 << endl;

为表明观点才写为如上形式,其实应该是如下:

cout << resetiosflags( ios_base::basefield )
     <<   setiosflags( ios_base::hex
                     | ios_base::showbase
                     | ios_base::uppercase )
     << 20 << endl;

其中 ios_base::basefield 等于 (ios_base::hex | ios_base::dec | ios_base::oct)。

之所以你的前一种写法得到那样的结果,是因为你在设置进制前没有清除原有进制信息,而在你所用的开发环境中,原有进制信息(hex,dec,oct)跟 showbase 信息有某种关联,于是因为不严谨的写法而得出那样的结果。

至于你后一种写法的正确,是因为:

cout << hex;

等效于:

cout << resetiosflags( ios_base::basefield )
     <<   setiosflags( ios_base::hex);

它在设置新进制信息前先清除了原有的进制信息,最后才正确。

看上去很麻烦,但这才够严谨,否则,因为实现机理的不同,你会在不同的开发环境得到各种诡异的结果。

热心网友

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 << 20 << std::endl;

方法二:

std::cout << std::hex << std::setiosflags (std::ios::showbase | std::ios::uppercase) << 20 << std::endl;

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com