变量的作用域即变量有效的代码区间,C语言中对于不同语句块中同名变量问题的处理也可以参考此处对变量作用域的解释(C++中用namespace解决这个问题)。简单地说,变量的作用域就是定义该变量的语句块。如果在所有函数外部定义的变量,其作用域为该源代码文件。
举例如下:
#include <stdio.h>
void myfun(void); //myfun函数的定义放在main函数后面,则需要在这里进行声明
int va = 0; //全局变量,作用域为整个文件
int main(void)
{
printf("第一次:%5d\n", va); //打印0,表明此va是文件开头的那个全局变量
int va = 1; //作用域为main函数内部
printf("第二次:%5d\n", va); //打印1,表明此va是刚刚定义的那个变量
{
int va = 3; //作用域为此语句块
printf("第三次:%5d\n", va); //打印3,表明此va是上一行刚刚定义的那个变量
}
printf("第四次:%5d\n", va); //打印1,表明此va是main函数开头定义的那个变量
myfun(); //打印0,表明函数myfun中的va是文件开头的那个全局变量
return 0;
}
void myfun(void)
{
printf("函数myfun中:%5d\n", va); //打印0,表明此va是文件开头的那个全局变量
}
程序运行结果如下图所示:
从上面的示例可以清楚地看出,共定义了3个变量va,其作用域各有不同。当在某个域中有多个va时,则选择其上距离最近的va。
具体分析如下:
- 第一次打印时,main函数中还未定义变量va,因此打印的是文件中的全局变量va,其值为0;
- 第二次打印时,main函数中定义了同名变量va,打印语句中使用距离该printf语句最近的va,其值为1;
- 第三次打印时,复合语句中定义了同名变量va,打印语句中使用距离该printf语句最近的va,其值为3;
- 第四次打印时,复合语句块已经结束,其中的va被释放了,因此打印语句中使用的va还是main函数中定义的,其值为1;
- 在函数myfun中,没有声明任何变量,也没有传入参数,其中的变量va是文件全局变量va,其值为0。