复合语句
复合语句 (Compound Statement) 是用花括号包裹的一组声明与语句,也常被称为“块”。它不仅是排版工具,更是作用域和存储期的边界。
1. 基本语法
c
{
声明序列
语句序列
}1
2
3
4
2
3
4
运行结果:该代码块主要用于语法或结构说明,单独运行通常无终端输出。
进入块时,块内自动存储期对象开始生效;离开块时,它们的生命周期结束。这个规则决定了资源管理、错误处理和局部封装的写法。
2. 复合语句与作用域
c
#include <stdio.h>
int main(void) {
int x = 1;
{
int y = 2;
printf("%d %d\n", x, y);
}
printf("%d\n", x);
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
可能的输出(示例):
bash
<输出与输入或平台相关,请以实际运行为准>
y 只在内层块可见。把逻辑切分成小块,既能限制名字泄露范围,也能让生命周期贴近使用点。
3. 空复合语句
{} 也是合法语句。它常用于占位、宏展开兼容或分支对齐。虽然语义简单,但若频繁出现空块,通常说明控制流可以重构得更清晰。
4. 使用建议
即使控制分支当前只有一条语句,也优先使用复合语句。这样在后续扩展时不会破坏结构,也能避免“悬垂 else”等经典陷阱。
5. 与资源管理的关系
复合语句还是“资源生命周期贴近使用点”的基础工具。把对象声明放进更小的块,能让初始化、使用和收尾在同一视野内完成,减少状态扩散。
c
#include <stdio.h>
int print_first_line(const char *path) {
int rc = 1;
{
FILE *fp = fopen(path, "r");
if (fp == NULL) {
return rc;
}
char buf[256];
if (fgets(buf, sizeof buf, fp) != NULL) {
puts(buf);
rc = 0;
}
fclose(fp);
}
return rc;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
可能的输出(示例):
bash
<输出与输入或平台相关,请以实际运行为准>
这个例子里 fp 和 buf 的可见范围都被限制在内层块中,后续代码不可能误用它们,结构会更稳。
6. 声明与语句交错
现代 C 允许在复合语句中把声明和普通语句交错书写。这样可以把对象声明放在首次使用附近,减少“声明处离使用处过远”的阅读负担。
c
{
step1();
int code = step2();
if (code != 0) {
handle(code);
}
}1
2
3
4
5
6
7
2
3
4
5
6
7
运行结果:该代码块主要用于语法或结构说明,单独运行通常无终端输出。
当对象生命周期应尽量短时,这种写法通常更清晰。
7. 与跳转语句的配合
复合语句天然形成作用域边界,因此在使用 goto、break、return 等跳转语句时,块结构能帮助你明确“哪些对象在跳转后仍可访问、哪些对象已经离开作用域”。先把块边界画清楚,再设计跳转路径,控制流会更稳。