虽然C语言不允许在函数内部定义新的函数,但可以允许在函数内部以程序块结构的形式定义变量。
第四章 函数与程序结构 >> 4.8 程序块结构
变量的声明、定义除了可以紧跟在函数开始的花括号之后,也可以紧跟在任何其他标识的复合语句开始的花括号之后。
以这种方式声明的变量其作用域就是对应的花括号的范围之内,因此可以隐藏程序块之外的与之同名的变量。
在下面这个程序中,
if (n > 0) { int i; /* declare a new i */ for (i = 0; i < n; i++) ... ... }
变量 i 的作用域是 if 语句的“真”分支,这个 i 与程序块外声明的 i 无关。每次进入程序块时,在程序内声明及初始化的局部变量都将被初始化(静态变量只在第一次进入程序块时被初始化一次)。
自动变量(包括形式参数)也可以隐藏与之同名的外部变量与函数。比如:
int x; int y; f(double x) { double y; }
两个同名变量 x 之间没有任何关系,两个 y 也是如此。
不过,最后还要强调一句的是,我们应该尽量避免出现变量名隐藏外部作用域中同名变量的情况,因为这个很容易引起混淆和错误。