什么是复合语句(代码块)?
复合语句(又称“代码块”或“块语句”)是由零条或多条语句组成的集合,编译器将其视为一条完整语句。
代码块以左大括号 { 开始,以右大括号 } 结束,其间放置待执行的语句。在任何允许出现单条语句的上下文中,均可使用代码块。代码块末尾无需分号。
在函数定义中,函数体本身就是一个代码块:
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 层以内。若嵌套过深,应将最深层代码块提取为独立函数,以提高可读性与可维护性。
