setw()函数表示的是输出字符的宽度,不是指的填充或者空格的宽度,也就是说你使用cout<<setw(9)<<123;之后,如果是右对齐则在123前面有6个空格,整个输出占9个字符,并不是前面有9个空格或者填充符,如果是9个空格或者填充符,则输出的就是不9个字符宽了,而是12个字符宽,而且这样也根本如法控制输出的宽度,比如你可以cout<<setw(9)<<12345;如果前面是9个空格或填充符,则实际输出就占了14个字符了。
注意setw(9)是设置的下一次输出的字符宽度,并不是设置的前一次输出的字符宽度,而且再一次输出时则会还原为默认的宽度
下面逐一解释答案
cout<<setfill('*’)<<123<<setw(9)<<321;
首先设置使用'*'填充空白处,然后输出123,然后再设置下一次输出的字符宽度为9,注意setw(9)是设置的下一次输出的字符宽度,并不是设置的前一次输出的字符宽度,而且再一次输出时则会还原为默认的宽度,也就是输出123时不是9个宽度,而输出321时则必须要有9个字符宽度,因为默认输出是右对齐的,因此321被输出到宽度的最右面,这样的话在321的前面就有6个空白,因此使用'*'填充,结果就输出123******321
cout<<setfill(‘*’)<<setw(6)<<left<<123<<setw(6)<<right<<321;
同理,第一个setw(6)表示输出123时要占据6个字符宽度,空白处使用*填充,而且输出123时使用左对齐(左对齐就意味着输出的数据在整个字符宽度的最左边,而空白或者填充字符自然就在这些数据的右边了)因此输出123,然后在数字123的右边填充3个*,同理输出321是在右边,然后在321的左边(也就是前面)填充3个*,因此结果就是123******321
cout<<123<<setfill(‘*’)<<setw(6)<<321;
这一个输出的结果很明显是123***321,这里不解释了
cout<<setfill(‘*’)<<SetW(9)<<left<<123<<321;
这一个解释一下,这里要特别注意setw()只对后一次的输出有效,再一次输出就会被还原为默认值,因此这里的setw(9)只对输出的数字123有效果,对输出的数字321则是无效的,而setw(9)后面的left并不是输出内容,而是在为输出设置格式,所以cout<<left并不算输出,并不会影响到setw()函数的设置。因此这道题在输出123时是使用的左对齐,也就是123被输出到左边占据9个字符宽度,因此会被填充6个*,然后再输出321,这里的321占据的宽度被还原为了默认值,因此只占3个宽度,所以结果就是123******321
综上所述,只有答案C的输出不一样,所以选C
补充一点:应用控制符之后的内容将一直按照该格式输出,除非重新对格式进行设置,题目中的left和right是属于控制符。而setfill和setw是属于
头文件iomanip中的内容,而setfill()的设置会一直保持有效,直到被重新设置;但setw()的设置则只在下一次输出时有效,再一下次输出时系统将还原为默认的宽度。