1、阅读下列程序,然后上机运行验证输出结果,并回答下列问题。 #include <iostream> using namespace std; void showflags(long f) { long i = 0x8000; for(; i; i=i>>1) { if(i&f) cout<<"1"; else cout<<"0"; } cout<<endl; } int main() { showflags(cout.flags()); cout<<"x_width="<<cout.width()<<endl; cout<<"x_fill="<<cout.fill()<<endl; cout<<"x_precision="<<cout.precision()<<endl; cout<<123<<" "<<123.45678<<endl; cout<<"-----------------------------"<<endl; cout<<"* * * x_width=10,x_fill= ,x_precision=4 * * *"<<endl; cout.width(10); cout.precision(4); cout<<123<<" "<<123.45678<<" "<<234.567<<endl; -------------------① cout<<"x_width="<<cout.width()<<endl; cout<<"x_fill="<<cout.fill()<<endl; cout<<"x_precision="<<cout.precision()<<endl; cout<<"-----------------------------"<<endl; cout<<"* * * x_width=10,x_file=&,x_precision=4 * * *"<<endl; cout.fill('&'); cout.width(10); cout<<123<<" "<<123.45678<<endl; cout.setf(ios::left); cout.width(10); cout<<123<<" "<<123.45678<<endl; cout<<"x_width="<<cout.width()<<endl; cout<<"x_fill="<<cout.fill()<<endl; cout<<"x_precision="<<cout.precision()<<endl; showflags(cout.flags());----------------------------------------------------------② cout.setf(ios::right|ios::unitbuf); showflags(cout.flags());----------------------------------------------------------③ return 0; } 问题一:①处的输出结果是什么,为什么? 问题二:②处的输出结果是什么,为什么? 问题三:③处的输出结果是什么,为什么? (提示:在x_flags变量中left=0x0002,right=0x0004,unitbuf=0x2000)
时间: 2023-09-20 19:12:39 浏览: 78
答案如下:
问题一:①处的输出结果是:
111100000000000000000000
x_width=0
x_fill=
x_precision=6
123 123.457
-----------------------------
* * * x_width=10,x_fill= ,x_precision=4 * * *
123 123.5 234.6
x_width=10
x_fill=
x_precision=4
-----------------------------
原因是在程序一开始的时候,调用了showflags函数,将cout对象的各个输出格式标志位的值输出为2进制形式,共16位,其中从左至右的前四位为0,代表输出格式是以十进制数形式输出;接下来的一位为0,代表输出不带正负号;再接下来的一位为1,代表输出时在数值前加上空格;后面的11位为0,代表输出的宽度为0,填充字符为默认的空格,精度为6。接下来又输出了123和123.45678两个数,被默认的空格分隔开来。然后通过调用cout对象的width(10)和precision(4)函数,分别将输出的宽度设置为10,精度设置为4(小数点后保留4位)。再次输出123和123.45678两个数时,它们之间填充了6个空格,而且123.45678被四舍五入保留了4位小数。最后再次调用showflags函数,输出cout对象的各个输出格式标志位的值,以及宽度、填充字符和精度的值,可以看到它们都得到了相应的修改。
问题二:②处的输出结果是:
x_width=10
x_fill=&
x_precision=4
-----------------------------
* * * x_width=10,x_file=&,x_precision=4 * * *
123&&&&&&& 123.4568
123.000000 123.4568
x_width=10
x_fill=&
x_precision=4
110000000000000000000111
原因是在程序中调用了cout对象的fill()和setf()函数,将输出的填充字符设置为&,并将左对齐标志(ios::left)设置为1。然后通过调用cout对象的width(10)和precision(4)函数,分别将输出的宽度设置为10,精度设置为4(小数点后保留4位)。接下来多次输出数字,可以看到填充字符确实变成了&,而且123被填充了8个&符号,而123.45678则被四舍五入保留了4位小数后输出。接下来再次调用showflags函数,可以看到输出格式标志位的值发生了变化,变为了110000000000000000000111,其中右对齐标志(ios::right)和流缓存标志(ios::unitbuf)都被设置为了1。
问题三:③处的输出结果是:
111000000000010000000111
000000000000010000000111
原因是在程序中调用了cout对象的setf()函数,将输出的右对齐标志(ios::right)和流缓存标志(ios::unitbuf)分别设置为1。然后再次调用showflags函数,可以看到输出格式标志位的值发生了变化,变为了111000000000010000000111,其中右对齐标志和流缓存标志都为1。
阅读全文