std::cout 是 C++ I/O 流库中用于标准输出(通常是控制台/终端)的对象。要使用它,必须包含 <iostream> 头文件。


C++ std::cout 使用方法详解

1. 基础:包含头文件和命名空间

在使用 cout 之前,必须包含 <iostream> 头文件。cout 位于 std 命名空间中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>

int main() {
// 必须使用 std:: 前缀
std::cout << "Hello, world!" << std::endl;

// 或者使用 using 声明
using std::cout;
using std::endl;

cout << "Hello again!" << endl;

// 或者使用 using namespace (在小程序中可以,但在头文件或大型项目中不推荐)
// using namespace std;
// cout << "Hello third time!" << endl;

return 0;
}

2. 输出流插入运算符 (<<)

<< 运算符被称为“流插入运算符”。它将其右侧的操作数“插入”到左侧的输出流对象(这里是 cout)中。

cout 可以自动识别并正确格式化所有 C++ 内置的基本数据类型。

示例:输出不同类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <string> // 包含 string 头文件

int main() {
int age = 30;
double pi = 3.14159;
char initial = 'G';
const char* c_string = "C-style string"; // C风格字符串
std::string cpp_string = "C++ std::string"; // C++ string对象
bool is_true = true;

// 1. 输出整数
std::cout << "Age: " << age << std::endl;

// 2. 输出浮点数
std::cout << "Pi: " << pi << std::endl;

// 3. 输出字符
std::cout << "Initial: " << initial << std::endl;

// 4. 输出C风格字符串 (const char*)
std::cout << "C-string: " << c_string << std::endl;

// 5. 输出C++ string 对象
std::cout << "C++ string: " << cpp_string << std::endl;

// 6. 输出布尔值 (默认输出 1 或 0)
std::cout << "Boolean true: " << is_true << std::endl;

return 0;
}

输出:

1
2
3
4
5
6
Age: 30
Pi: 3.14159
Initial: G
C-string: C-style string
C++ string: C++ std::string
Boolean true: 1


3. 链式输出

<< 运算符返回其左侧流对象的引用,这意味着你可以将多个 << 运算符链接在一条语句中。

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

int main() {
std::string name = "Alice";
int score = 100;

// 链式调用
std::cout << "User: " << name << ", Score: " << score << std::endl;

return 0;
}

输出:

1
User: Alice, Score: 100


4. 控制换行 (\n vs std::endl)

有两种主要方式来输出一个换行符:

  1. \n:这是一个转义字符,代表换行。它只插入一个换行符,不会刷新输出缓冲区。
  2. std::endl:这是一个操纵符 (manipulator)。它会:
    a. 插入一个换行符 (\n)。
    b. 刷新 (Flush) 输出缓冲区。

什么是刷新缓冲区?
I/O 操作通常是昂贵的。为了提高效率,cout 会将要输出的内容暂存到一个缓冲区(一块内存)中。当缓冲区满了,或者遇到特定条件(如 std::endl),它才会把缓冲区中的所有内容一次性发送到输出设备(如控制台)。

  • std::endl:确保内容立即显示,但在循环中大量使用可能会导致性能下降。
  • \n:效率更高,因为它不强制刷新。缓冲区会在适当的时候自动刷新(例如程序结束时,或者缓冲区满了)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>

int main() {
// 使用 std::endl (插入换行并刷新)
std::cout << "Line 1" << std::endl;
std::cout << "Line 2" << std::endl;

// 使用 \n (只插入换行)
std::cout << "Line 3\n";
std::cout << "Line 4\n";

// 在最后手动刷新缓冲区(如果之前用了 \n)
std::cout.flush();

return 0;
}

建议:

  • 在需要立即看到输出时(例如调试时打印变量,或在程序崩溃前打印错误信息),使用 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <iomanip> // 必须包含

int main() {
double value = 123.456789;
bool is_ready = true;

// 1. setprecision 和 fixed (控制小数位数)
std::cout << "--- 精度控制 ---" << std::endl;
std::cout << "默认: " << value << std::endl;
std::cout << "setprecision(5): " << std::setprecision(5) << value << std::endl;
std::cout << "fixed + setprecision(2): " << std::fixed << std::setprecision(2) << value << std::endl;

// 必须重置流状态,否则 'fixed' 会一直生效
std::cout.unsetf(std::ios::fixed); // 解除 fixed

// 2. setw, setfill 和 left/right (对齐)
std::cout << "\n--- 对齐控制 ---" << std::endl;
std::cout << "Default: " << 123 << std::endl;

// 设置宽度10,右对齐(默认),用'*'填充
std::cout << "setw(10), setfill('*'): "
<< std::setw(10) << std::setfill('*') << 123 << std::endl;

// 设置宽度10,左对齐
std::cout << "setw(10), left: "
<< std::left << std::setw(10) << 123 << " (End)" << std::endl;

// 恢复默认值
std::cout << std::right << std::setfill(' ');

// 3. boolalpha (输出 true/false)
std::cout << "\n---布尔值控制---" << std::endl;
std::cout << "默认: " << is_ready << std::endl;
std::cout << "boolalpha: " << std::boolalpha << is_ready << std::endl;
std::cout << "noboolalpha: " << std::noboolalpha << is_ready << std::endl;

return 0;
}

输出:

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 的成员函数

coutostream 类的对象,它也有一些有用的成员函数。

函数 功能
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>

int main() {
// 1. cout.put()
std::cout.put('A');
std::cout.put('B');
std::cout.put('\n');

// 2. cout.write()
const char* message = "Hello\0World"; // 中间有 \0
// write 会输出 \0 后的内容
std::cout.write(message, 11);
std::cout.put('\n');

// '<<' 运算符遇到 \0 就会停止
std::cout << message << std::endl;

// 3. 使用成员函数设置格式
double pi = 3.14159;
std::cout.precision(3); // 设置精度
std::cout.width(10); // 设置宽度
std::cout.fill('#'); // 设置填充
std::cout << pi << std::endl;

// 注意:width() 和 setw() 一样,只生效一次
std::cout << pi << std::endl;

return 0;
}

输出:

1
2
3
4
5
AB
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)。