[数据结构·C++语法] cout 使用方法详解
std::cout 是 C++ I/O 流库中用于标准输出(通常是控制台/终端)的对象。要使用它,必须包含 <iostream> 头文件。
C++ std::cout 使用方法详解
1. 基础:包含头文件和命名空间
在使用 cout 之前,必须包含 <iostream> 头文件。cout 位于 std 命名空间中。
1 |
|
2. 输出流插入运算符 (<<)
<< 运算符被称为“流插入运算符”。它将其右侧的操作数“插入”到左侧的输出流对象(这里是 cout)中。
cout 可以自动识别并正确格式化所有 C++ 内置的基本数据类型。
示例:输出不同类型
1 |
|
输出:1
2
3
4
5
6Age: 30
Pi: 3.14159
Initial: G
C-string: C-style string
C++ string: C++ std::string
Boolean true: 1
3. 链式输出
<< 运算符返回其左侧流对象的引用,这意味着你可以将多个 << 运算符链接在一条语句中。
1 |
|
输出:1
User: Alice, Score: 100
4. 控制换行 (\n vs std::endl)
有两种主要方式来输出一个换行符:
\n:这是一个转义字符,代表换行。它只插入一个换行符,不会刷新输出缓冲区。std::endl:这是一个操纵符 (manipulator)。它会:
a. 插入一个换行符 (\n)。
b. 刷新 (Flush) 输出缓冲区。
什么是刷新缓冲区?
I/O 操作通常是昂贵的。为了提高效率,cout 会将要输出的内容暂存到一个缓冲区(一块内存)中。当缓冲区满了,或者遇到特定条件(如 std::endl),它才会把缓冲区中的所有内容一次性发送到输出设备(如控制台)。
std::endl:确保内容立即显示,但在循环中大量使用可能会导致性能下降。\n:效率更高,因为它不强制刷新。缓冲区会在适当的时候自动刷新(例如程序结束时,或者缓冲区满了)。
1 |
|
建议:
- 在需要立即看到输出时(例如调试时打印变量,或在程序崩溃前打印错误信息),使用
std::endl。 - 在性能敏感的地方(例如在循环中打印大量数据),优先使用
\n,并在必要时(例如循环外)手动调用std::cout.flush();。
5. 格式化输出 (操纵符)
cout 可以与 <iomanip> (I/O Manipulators) 头文件中的操纵符结合使用,以控制输出的格式。
| 操纵符 | 功能 | 需要 <iomanip> |
|---|---|---|
std::setw(n) |
设置下一个输出项的字段宽度为 n。(非持久) |
是 |
std::setprecision(n) |
设置浮点数的显示精度为 n 位。(持久) |
是 |
std::fixed |
(与 setprecision 配合) 使浮点数固定显示小数点后 n 位。(持久) |
否 |
std::scientific |
使用科学计数法显示浮点数。(持久) | 否 |
std::left / std::right |
设置字段内的对齐方式(默认是 right)。(持久) |
否 |
std::setfill(c) |
设置当 setw 宽度大于输出项时,用字符 c 填充。(持久) |
是 |
std::boolalpha |
将 true/false 按字符串形式输出,而不是 1/0。(持久) |
否 |
std::noboolalpha |
恢复 bool 值为 1/0 输出。(持久) |
否 |
(持久):意味着一旦设置,它将影响后续所有 cout 输出,直到被更改。
(非持久):如 setw,只影响紧随其后的第一个输出项。
示例:使用 <iomanip>
1 |
|
输出:1
2
3
4
5
6
7
8
9
10
11
12
13
14--- 精度控制 ---
默认: 123.457
setprecision(5): 123.46
fixed + setprecision(2): 123.46
--- 对齐控制 ---
Default: 123
setw(10), setfill('*'): *******123
setw(10), left: 123 (End)
---布尔值控制---
默认: 1
boolalpha: true
noboolalpha: 1
6. cout 的成员函数
cout 是 ostream 类的对象,它也有一些有用的成员函数。
| 函数 | 功能 |
|---|---|
cout.put(char c) |
输出单个字符。 |
cout.write(const char* s, streamsize n) |
输出一个缓冲区 s 中的 n 个字符(即使遇到 \0 也继续)。 |
cout.flush() |
强制刷新输出缓冲区。 |
cout.precision(n) |
同 std::setprecision(n)。 |
cout.width(n) |
同 std::setw(n)。 |
cout.fill(c) |
同 std::setfill(c)。 |
cout.setf(flags) / cout.unsetf(flags) |
设置/取消设置格式化标志(如 std::ios::fixed)。 |
示例:使用成员函数
1 |
|
输出:1
2
3
4
5AB
Hello World
Hello
#######3.14
3.14
表格原始 Markdown 语法
根据您的要求,以下是上述内容中表格的原始 Markdown 语法:
| 操纵符 | 功能 | 需要 <iomanip> |
|---|---|---|
std::setw(n) |
设置下一个输出项的字段宽度为 n。(非持久) |
是 |
std::setprecision(n) |
设置浮点数的显示精度为 n 位。(持久) |
是 |
std::fixed |
(与 setprecision 配合) 使浮点数固定显示小数点后 n 位。(持久) |
否 |
std::scientific |
使用科学计数法显示浮点数。(持久) | 否 |
std::left / std::right |
设置字段内的对齐方式(默认是 right)。(持久) |
否 |
std::setfill(c) |
设置当 setw 宽度大于输出项时,用字符 c 填充。(持久) |
是 |
std::boolalpha |
将 true/false 按字符串形式输出,而不是 1/0。(持久) |
否 |
std::noboolalpha |
恢复 bool 值为 1/0 输出。(持久) |
否 |
表格 2:cout 成员函数
| 函数 | 功能 |
|---|---|
cout.put(char c) |
输出单个字符。 |
cout.write(const char* s, streamsize n) |
输出一个缓冲区 s 中的 n 个字符(即使遇到 \0 也继续)。 |
cout.flush() |
强制刷新输出缓冲区。 |
cout.precision(n) |
同 std::setprecision(n)。 |
cout.width(n) |
同 std::setw(n)。 |
cout.fill(c) |
同 std::setfill(c)。 |
cout.setf(flags) / cout.unsetf(flags) |
设置/取消设置格式化标志(如 std::ios::fixed)。 |
