复合语句(compound statement)简称为语句块,它使用大括号把许多语句和声明组合到一起,形成单条语句。
语句块与简单的语句不同,语句块不用分号当作结尾。当出现语法上某处需要一条语句,但程序却需要执行多条语句时,就可以用到语句块。例如,可以在 if 语句中使用语句块,或者当循环体需要执行多条语句时,也可以使用语句块:
{ double result = 0.0, x = 0.0; // 声明
static long status = 0;
extern int limit;
++x; // 语句
if ( status == 0 )
{ // 新语句块
int i = 0;
while ( status == 0 && i < limit )
{ /* ... */ } // 另一个语句块
}
else
{ /* ... */ } // 第三个语句块
}
如果语句块内需要有声明,通常会把声明放在语句块的头部,在其他语句之前。然而,C99 并不强制这么做,允许将声明放在语句块内的任何地方。
在语句块内声明的名称将具有语句块作用域。换句话说,这些名称只有自声明点开始,一直到语句块结尾之前有效。在这个作用域内,这种声明会把在语句块以外声明的同名称对象隐藏起来。
同样地,动态变量的存储周期也被限制在语句块中它们生成的地方。这意味着,如果一个变量没有被声明为 static 或 extern,那么该变量的存储空间会在语句块结束之后自动被释放。