转载自:http://blog.sina.com.cn/s/blog_70ec9a6f010146g6.html
变量的作用域是指其在程序中可以被访问的一个或多个区域。只要分属不同的作用域,可以给变量取相同的名字。作用域有三种:代码块作用域、原型作用域、文件作用域及函数作用域。
1、代码块作用域
根据代码块的定义,任何一对花括号都可构成一个代码块,代码块里用花括号括起来的复合语句当然也算一个代码块。要注意的是:
1)
2)
3)
例如:
int main(void)
{
}
输出结果:
###i=5
***i=0
***i=1
***i=2
###i=3
若将for(i=0;i<3;i++)改成for(int i=0;i<3;i++),则输出结果为
###i=5
***i=0
***i=1
***i=2
###i=5
程序说明:
使用for(i=0;i<3;i++)时,这个i是原有的i,所有for循环直接修改的也是原有的i。for结束时,i已变为3,所以最后输出地是###i=3
使用for(int i=0;i<3;i++)时,此时的i是一个新定义的变量,与原先的变量i同名,因此将临时覆盖原先的i,for循环中修改的也是这个临时的i。等到for循环结束后,i恢复为原来的变量,所以最后的输出是###i=5
再看一段程序:
int i=30;
输出结果:
### i=101
### i=101
### i=101
@@@ i=34
程序说明:
1)for后面括号里的i是原先定义的i,而花括号里的i是新定义的i,它的作用域为花括号,且每次花括号里面的语句执行完后,这个i都将消失,因此,再次进入for语句,进行i++<33检验时,是原先的i。
2)i++<33是先将i与33比较,不管结果如何,都会将i进行++操作。如果程序如下
int i=30;
输出结果为
### i=31
### i=32
### i=33
@@@ i=34
第一次比较时,i=30,成立,i++,变为31,打印### i=31
第一次比较时,i=31,成立,i++,变为32,打印### 32
第一次比较时,i=32,成立,i++,变为33,打印### 33
第一次比较时,i=33,失败,i++,变为34,循环结束,执行循环后的打印语句,@@@ i=34
2、文件作用域
在所有代码块之外定义的标识符,都具有文件作用域。从它们声明之处开始到源文件结束。
#include <stdio.h>
#include <E:\学习\C和指针\test.h>
int j=6;
int main(void)
{
}
其中,test.h内容为
int i=10;
输出结果是
###i=10,j=6
***i=5,j=7
程序说明:
1)
2)
3、原型作用域
其实就是注意原型里不能有同名变量即可。
4、函数作用域
主要是针对goto语句,一个函数中的goto语句标签必须唯一。
代码块:用花括号括起来的部分就成为代码块。
note:
作用域:程序(全局变量)->文件(全局变量)->函数(局部变量)