为什么这个C ++程序输出错误?

时间:2015-10-07 18:16:52

标签: c++ hex iostream numeric octal

考虑以下计划:

#include <iostream>
int main()
{
    std::cout<<std::ios::showbase<<123<<", "<<std::hex<<123<<", "<<std::oct<<123<<'\n';
}

预期输出:123,0x7b,0173

获得的输出:512123,7b,173(参见现场演示:http://ideone.com/Khzj5j

但如果我稍微修改上述程序如下:

#include <iostream>
using namespace std;
int main()
{
    cout<<showbase<<123<<", "<<hex<<123<<", "<<oct<<123<<'\n';
}

现在我得到了理想的输出。 (请参阅此处的现场演示http://ideone.com/gcuHbm)。

为什么第一个程序输出错误但第二个程序没有?第一个项目出了什么问题?

4 个答案:

答案 0 :(得分:8)

std::ios::showbase是格式标志。 std::showbase是一个函数,需要std::ios_base并在其上调用ios_base::setf(std::ios::showbase)来设置showbase标记。

您在第一个示例中使用了先验,在第二个示例中使用了后者。

答案 1 :(得分:2)

#include <iostream>
int main()
{
    std::cout<<std::ios::showbase<<123<<", "<<std::hex<<123<<", "<<std::oct<<123<<'\n';
}

这使用std::ios::showbasehttp://www.cplusplus.com/reference/ios/ios_base/fmtflags/

而你的其他节目

#include <iostream>
using namespace std;
int main()
{
    cout<<showbase<<123<<", "<<hex<<123<<", "<<oct<<123<<'\n';
}

使用std::showbasehttp://en.cppreference.com/w/cpp/io/manip/showbase),这就是您获得不同结果的原因。

更改第一个使用std::showbase的程序可以获得预期的输出:

#include <iostream>
int main()
{
    std::cout<<std::showbase<<123<<", "<<std::hex<<123<<", "<<std::oct<<123<<'\n';
}

http://ideone.com/OodBvo

答案 2 :(得分:2)

std::ios::showbase是一个格式标志,具有一些实现定义的值。当您调用std::cout << std::ios::showbase时,您正在显示该值而不是设置流格式标志。

在第二个示例中,您正在使用std::showbase来设置流的格式标志。

答案 3 :(得分:1)

std::ios_base中,showbasefmtflag,具有实现定义的值。在这种情况下,它似乎是512。另一方面,还有一个名为showbase的流操作符(也称为函数),它调用setf(std::ios_base::showbase)。这被定义为namespace std中的免费功能,而fmtflagstd::ios_base的成员。