什么是复合语句(代码块)?
复合语句(又称“代码块”或“块语句”)是由零条或多条语句组成的集合,编译器将其视为一条完整语句。
代码块以左大括号 {
开始,以右大括号 }
结束,其间放置待执行的语句。在任何允许出现单条语句的上下文中,均可使用代码块。代码块末尾无需分号。
在函数定义中,函数体本身就是一个代码块:
int add(int x, int y)
{ // 代码块开始
return x + y;
} // 代码块结束(无分号)
int main()
{ // 代码块开始
int value {}; // 这是初始化语句,不是代码块
add(3, 4);
return 0;
} // 代码块结束(无分号)
代码块的嵌套
虽然函数不能嵌套定义,但代码块可以嵌套在其他代码块之内:
int add(int x, int y)
{ // 外层代码块
return x + y;
} // 外层代码块结束
int main()
{ // 外层代码块
int value {};
{ // 内层/嵌套代码块
add(3, 4);
} // 内层代码块结束
return 0;
} // 外层代码块结束
在这种嵌套关系中,包含其他代码块的称为“外层代码块”,被包含的称为“内层代码块”或“嵌套代码块”。
使用代码块实现条件多语句执行
代码块最常见的用途之一是与 if
语句结合。默认情况下,if
语句在条件为真时仅执行一条语句;若需执行多条语句,可用代码块替换该单条语句。
示例:
#include <iostream>
int main()
{ // 外层代码块开始
std::cout << "请输入一个整数: ";
int value {};
std::cin >> value;
if (value >= 0)
{ // 嵌套代码块开始
std::cout << value << " 是非负整数\n";
std::cout << "该数的两倍为 " << value * 2 << '\n';
} // 嵌套代码块结束
else
{ // 另一嵌套代码块开始
std::cout << value << " 是负整数\n";
std::cout << "该数的绝对值为 " << -value << '\n';
} // 另一嵌套代码块结束
return 0;
} // 外层代码块结束
当用户输入 3 时,程序输出:
请输入一个整数: 3
3 是非负整数
该数的两倍为 6
输入 -4 时,输出:
请输入一个整数: -4
-4 是负整数
该数的绝对值为 4
代码块的嵌套层级
甚至可以在嵌套代码块内再嵌套代码块:
#include <iostream>
int main()
{ // 层级 1 的代码块
std::cout << "请输入一个整数: ";
int value {};
std::cin >> value;
if (value > 0)
{ // 层级 2 的代码块
if ((value % 2) == 0)
{ // 层级 3 的代码块
std::cout << value << " 是正偶数\n";
}
else
{ // 层级 3 的另一代码块
std::cout << value << " 是正奇数\n";
}
}
return 0;
}
函数的“嵌套层级”(nesting level 或 nesting depth)指在函数内部任一时刻所能处于的最大代码块深度(包含最外层)。上例共有 4 个代码块,但最大嵌套层级为 3,因为程序运行时不可能同时位于超过 3 层代码块内。
C++ 标准要求编译器至少支持 256 层嵌套,但并非所有实现均满足(例如,截至撰写时 Visual Studio 支持的层数更少)。
最佳实践
将函数的嵌套层级控制在 3 层以内。若嵌套过深,应将最深层代码块提取为独立函数,以提高可读性与可维护性。