cout 是C++中 ostream 类型的对象,该类被封装在 < iostream > 库中,该库定义的名字都在命名空间 std 中,所以 cout 全称是 std::cout

1. cout使用的三种方式

前提:如果程序中想使用 cout ,需要包含库 < iostream >
因为 coutstd 库中的一个类的对象,所以使用的方法是 std::cout ,如下:

#include <iostream>
int main(){
	int i;
	std::cin >> i;
	std::cout << i << std::endl;
	return 0;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如果程序中频繁出现 cout ,这样的操作极为不便,所以可以使用下面两种方法来解决。

方法一 :使用 std 命名空间

#include <iostream>
using namespace std;
int main(){
	int i;
	cin >> i;
	cout << i << endl;
	return 0;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这样,后面程序中可以直接使用 cout ,而且std中的其他名字也可以直接使用,如 cinendl 等。

方法二 :使用 std 命名空间中的 cout

#include <iostream>
using namespace std::cout;
int main(){
	int i;
	std::cin >> i;
	cout << i << std::endl;
	return 0;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这样,后面程序中只可以直接使用 cout ,而 std 中的其他名字不可以可以直接使用。

2. cout和i/i++/++i的组合使用

i++++i 是有着不同的含义,和 cout 组合使用也会得到不同的结果,下面给出一段代码:

#include <iostream>
using namespace std;
int main(){
	int i = 1;
	cout << ++i << i++ << i << i++ << ++i << endl;
	return 0;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这段代码的结果是多少呢?
A.23345
B.22335
C.54535
D.53525

我们不妨先理解一下 cout 输出控制台的过程。看下面这幅图:
输出方式
根据表达式来看, endl 会作为一个可以供 cout 接收的对象往前传,而 ++iendl 结合起来作为一个可以供 cout 接收的对象往前传,依次递推下去。物理实现上需要一个栈来保存可以供 cout 接收的对象,然后从右向左放到这个栈里,然后依次弹出输出在屏幕上。其中, i++i 会在栈里面保存 i 的引用,而 i++ 会在栈里面保存数字,过程如下:
入栈过程
第一步:将 endl 压入栈中, i 值不变;
第二步:将 i 的引用压入栈中, i 的值加 1 变成 2(因为是 ++i );
第三步:将 2 压入栈中, i 的值加 1 变成 3(因为是 i++ );
第四步:将 i 的引用压入栈中, i 的值不变(因为是 i );
第五步:将 3 压入栈中, i 的值加 1 变成 4(因为是 i++ );
第六步:将 i 的引用压入栈中, i 的值加 1 变成 5(因为是 ++i );
第七步:将栈里的数据依次弹出,即可得到 53525 。(因为i的值是 5 ,所以所有 i 的引用都是 5

3. 以不同进制输出数字

有时候,我们需要以不同的进制来输出数字,而默认输出是十进制,其他进制输出方法如下:

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
	int i = 90;
	cout << i << endl;
	cout << dec << i << endl;
	cout << oct << i << endl;
	cout << hex << i << endl;
	cout << setiosflags(ios::uppercase);
	cout << hex << i << endl;
	cout << setbase(8) << i << endl;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

输出结果如下:
输出结果
其中,oct 是八进制输出, dec 是十进制(效果和默认一样), hex 是十六进制输出(字母默认是小写字母)。这两个也包含在 std 中,即其全称分别是 std::octstd::decstd::hex ,这三个控制符包含在库 < iostream > 中。
setbase(n) 表示以 n 进制显示,包含在库 < iomanip > 中,n 只能取 8, 10, 16 三个值。
setiosflags(ios::uppercase) 表示将字母大写输出,包含在库 < iomanip > 中。
以上均包含在std 命名空间中。

4. 输出数字位数的控制

前提:包含库 < iomanip > ,这个库包含了对输入输出的控制。

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
	double i = 3333.1415926;
	cout << i << endl;
	cout << setprecision(3) << i << endl;
	cout << setprecision(9) << i << endl;
	cout << setiosflags(ios::fixed);
	cout << i << endl;
	cout << fixed << setprecision(3) << i << endl;
	cout << setprecision(9) << fixed <<  i << endl;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

输出结果如下:
输出结果
可以看出,C++默认浮点数输出有效位数是 6 位(若前面整数位数大于 6 位,使用科学计数法输出),而通过以下几种方式可以更改输出精度:
1.使用 setprecision(n) 即可设置浮点数输出的有效位数
(若前面整数位数大于 n 位,使用科学计数法输出)
2.使用 setiosflags(ios::fixed)fixed,表示对小数点后面数字的输出精度进行控制
所以,和 setprecision(n) 结合使用即可设置浮点数小数点后面数字的输出精度,位数不足的补零
以上均采用 “四舍五入” 的方法控制精度,三个控制符均包含在 std 命名空间中。

5. 强制显示小数点和正负号

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
	double i = 5, j = -5.2;
	cout << i << '\t' << j << endl;
	cout << setiosflags(ios::showpoint);
	cout << i << '\t' << j << endl;
	cout << setiosflags(ios::showpos);
	cout << i << '\t' << j << endl;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

输出结果如下:
输出结果
显示默认 6 位有效位数,两个控制符均包含在库 < iomanip > 中,std 命名空间中。

6. 设置宽度和对齐方式

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
	cout << "默认显示:" << endl;
	for (int i = 1; i < 1000; i *= 10){
		cout << setw(8) << i << ':' << setw(8) << i * 10 << endl;
	}
	cout << "左对齐显示:" << endl;
	for (int i = 1; i < 1000; i *= 10){
		cout << setiosflags(ios::left);
		cout << setw(8) << i << ':' << setw(8) << i * 10 << endl;
	}
	cout << "右对齐显示:" << endl;
	for (int i = 1; i < 1000; i *= 10){
		cout << setiosflags(ios::right);
		cout << setw(8) << i << ':' << setw(8) << i * 10 << endl;
	}
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

输出结果如下:
输出结果
输出结果默认显示右对齐。三个控制符均包含在库 < iomanip > 中,std 命名空间中。

7. 设置填充字符

#include <iostream>
#include <iomanip>
using namespace std;
int main(){
	cout << setfill('*') << setw(8) << 1.22 << endl;
	cout << setfill('*') << setw(8) << endl;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出结果如下:
输出结果
控制符包含在库 < iomanip > 中,std 命名空间中。

8. iomanip库用法总结

< iomanip > 库封装了很多对输入输出流的操作,常见用法总结如下:

控制符作用
setbase(n)以n进制方式输出(n=8,10,16)
setfill(ch)设置字符填充,ch可以是字符常量或字符变量
setprecision(n)设置输出有效位数为n位
setw(n)设置字符宽度为n位,只对后一个有影响
setiosflags(ios::uppercase)以大写字母显示
setiosflags(ios::fixed)实现对小数点后的数字的控制
setiosflags(ios::scientific)以科学计数法显示
setiosflags(ios::showpoint)强制显示小数点
setiosflags(ios::showpos)强制显示正号
setiosflags(ios::left)设置输出左对齐
setiosflags(ios::right)设置输出右对齐
resetiosflags(…)终止括号中的输出格式
  •                     <li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#csdnc-thumbsup"></use>
                        </svg><span class="name">点赞</span>
                        <span class="count">19</span>
                        </a></li>
                        <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#icon-csdnc-Collection-G"></use>
                        </svg><span class="name">收藏</span></a></li>
                        <li class="tool-item tool-active is-share"><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;1582594662_002&quot;}"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#icon-csdnc-fenxiang"></use>
                        </svg>分享</a></li>
                        <!--打赏开始-->
                                                <!--打赏结束-->
                                                <li class="tool-item tool-more">
                            <a>
                            <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                            </a>
                            <ul class="more-box">
                                <li class="item"><a class="article-report">文章举报</a></li>
                            </ul>
                        </li>
                                            </ul>
                </div>
                            </div>
            <div class="person-messagebox">
                <div class="left-message"><a href="https://blog.csdn.net/qq_35481167">
                    <img src="https://profile.csdnimg.cn/E/9/7/3_qq_35481167" class="avatar_pic" username="qq_35481167">
                                            <img src="https://g.csdnimg.cn/static/user-reg-year/2x/4.png" class="user-years">
                                    </a></div>
                <div class="middle-message">
                                        <div class="title"><span class="tit"><a href="https://blog.csdn.net/qq_35481167" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">九霄星河</a></span>
                                            </div>
                    <div class="text"><span>发布了39 篇原创文章</span> · <span>获赞 62</span> · <span>访问量 4万+</span></div>
                </div>
                                <div class="right-message">
                                            <a href="https://im.csdn.net/im/main.html?userName=qq_35481167" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
                        </a>
                                                            <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a>
                                    </div>
                            </div>
                    </div>
    
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐