为什么这个 C++ 程序给出了错误的输出?
why this C++ program gives incorrect output?
考虑以下程序:
#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)。
为什么第一个程序给出了错误的输出而第二个程序却没有?第一个程序出了什么问题?
std::ios::showbase
是格式标志。 std::showbase
是一个接受 std::ios_base
并对其调用 ios_base::setf(std::ios::showbase)
以设置 showbase
标志的函数。
您在第一个示例中使用了先验,在第二个示例中使用了后者。
#include <iostream>
int main()
{
std::cout<<std::ios::showbase<<123<<", "<<std::hex<<123<<", "<<std::oct<<123<<'\n';
}
这使用 std::ios::showbase
(http://www.cplusplus.com/reference/ios/ios_base/fmtflags/)
而您的其他程序
#include <iostream>
using namespace std;
int main()
{
cout<<showbase<<123<<", "<<hex<<123<<", "<<oct<<123<<'\n';
}
使用 std::showbase
(http://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';
}
在 std::ios_base
中,showbase
是具有实现定义值的 fmtflag
。在这种情况下,它似乎是 512
。另一方面,有一个流操纵器(也称为函数)也称为 showbase
,它调用 setf(std::ios_base::showbase)
。这在 namespace std
中定义为自由函数,而 fmtflag
是 std::ios_base
的成员。
std::ios::showbase
是一个格式标志,具有一些实现定义的值。当您调用 std::cout << std::ios::showbase
时,您正在显示该值而不是设置流格式标志。
在您的第二个示例中,您使用 std::showbase
设置流的格式标志。
考虑以下程序:
#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)。
为什么第一个程序给出了错误的输出而第二个程序却没有?第一个程序出了什么问题?
std::ios::showbase
是格式标志。 std::showbase
是一个接受 std::ios_base
并对其调用 ios_base::setf(std::ios::showbase)
以设置 showbase
标志的函数。
您在第一个示例中使用了先验,在第二个示例中使用了后者。
#include <iostream>
int main()
{
std::cout<<std::ios::showbase<<123<<", "<<std::hex<<123<<", "<<std::oct<<123<<'\n';
}
这使用 std::ios::showbase
(http://www.cplusplus.com/reference/ios/ios_base/fmtflags/)
而您的其他程序
#include <iostream>
using namespace std;
int main()
{
cout<<showbase<<123<<", "<<hex<<123<<", "<<oct<<123<<'\n';
}
使用 std::showbase
(http://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';
}
在 std::ios_base
中,showbase
是具有实现定义值的 fmtflag
。在这种情况下,它似乎是 512
。另一方面,有一个流操纵器(也称为函数)也称为 showbase
,它调用 setf(std::ios_base::showbase)
。这在 namespace std
中定义为自由函数,而 fmtflag
是 std::ios_base
的成员。
std::ios::showbase
是一个格式标志,具有一些实现定义的值。当您调用 std::cout << std::ios::showbase
时,您正在显示该值而不是设置流格式标志。
在您的第二个示例中,您使用 std::showbase
设置流的格式标志。