### 复合语句

复合语句也被称为语句块，是由一对大括号和一组简单语句构成。通常，在开发应用程序时，将一组逻辑上相关的语句组合为一个复合语句，以描述一个业务逻辑或功能的实现。例如，下面的语句根据表达式的真假执行两组不同的操作，其中的每一组操作都是一个复合语句。

if (chCmd[0] == '1') //如果是命令字符 1,显示系统时间

{ //复合语句开始

time_t nowTime;

time(&nowTime); //获取系统时间

struct tm *sysTime = localtime(&nowTime); //转换为系统时间

cout << "系统时间：" << sysTime->tm_hour << ":" <<

sysTime->tm_min << ":" << sysTime->tm_sec <<endl; //输出信息

} //复合语句结束

else

{ //复合语句开始

time_t nowTime;

time(&nowTime); //获取系统时间

struct tm *sysTime = localtime(&nowTime); //转换为系统时间

cout << "系统日期：" << 1900 + sysTime->tm_year << "-" <<

sysTime->tm_mon + 1 << "-" << sysTime->tm_mday <<endl; //输出信息

} //复合语句结束

上述代码利用“{”和“}”定义了两组复合语句，用于获取系统日期和时间。

注意：复合语句的结尾处是没有分号的。

下面的复合语句是非法的。

{

int nLen = 10;

int nHeight = 100;

int nArea = nLen * nHeight;

}; //复合语句结尾不能有分号

在使用“{”和“}”符号设计复合语句时，复合语句中也可以不包含代码，此时的复合语句与空语句的作用是相同的。例如：

{}

上述代码定义了一个空复合语句，在程序中可以使用空复合语句来代替空语句。例如：

while ((*pdst++ = *psrc++) != '\0')

{

}

由于 while 循环语句要求必须有循环体，但在上面的代码中不需要循环体，为了防止出现 while 语句的语法错误，可以使用空的复合语句作为 while 语句的循环体。

在复合语句中也可以定义一些局部变量，但是这些变量只在复合语句内有效，在复合语句之外访问这些变量是非法的。例如：

{

int nLen = 10;

int nHeight = 100;

int nArea = nLen * nHeight;

}

cout << "面积 = " << nArea << endl; //错误的语句，无法访问 nArea 变量

在上述代码中，最后一行语句视图访问复合语句中的变量 nArea，由于 nArea 的作用域已消失，因此出现了 nArea 标识符没有声明的错误。解决方法，可以将最后一行语句放置在复合语句内。例如：

{

int nLen = 10; //定义一个整型变量, 初始化为 10

int nHeight = 100; //定义一个整型变量, 初始化为 100

int nArea = nLen * nHeight; //计算 nLen 与 nHeight 的乘积

cout << "面积 = " << nArea << endl; //输出 nArea

}

在复合语句中定义的局部变量，如果与外部作用域定义的变量相同，在复合语句内访问该变量，并且语句出现在局部变量定义之后，则该变量表示的是复合语句内定义的局部变量。例如：

复合语句中的局部变量

#include "stdafx.h"

#include <iostream.h>

int main(int argc, char* argv[])

{

int nArea = 500; //定义一个相对于复合语句的外部变量

{

cout << "外部变量 = " << nArea << endl; //输出外部变量

int nLen = 10;

int nHeight = 100;

int nArea = nLen * nHeight;

cout << "内部变量 = " << nArea << endl; //输出内部变量

}

cout << "外部变量 = " << nArea << endl; //输出外部变量

return 0;

}

运行程序，效果如图 1 所示。

图 1 复合语句