作用域是一个标识符在程序正文中有效的区域。
作用域分类:
- 函数原型作用域
- 局部作用域(块作用域)
- 类作用域
- 文件作用域(作用域到文件尾结束)
- 命名空间作用域(暂略)
作用域的可见性:
- 可见性是从对标识符的引用的角度来谈的概念
- 可见性表示从内层作用域向外层作用域“看”时能看见什么
- 如果标识在某处可见,就可以在该处引用此标识符
- 如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见
- 对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见
关于函数原型作用域,局部作用域(块作用域),文件作用域的例子如下面的程序(代码中有注释)
类作用域:例如p是类A中的一个数据成员,那么p在A的所有函数成员中都有效,除非函数成员中也定义了一个名称为p的变量,这样的p就具有类作用域
#include<stdio.h>
int n; //全局变量,属于文件作用域
int Pow(int x, int n); //函数原型中的参数,其作用域始于"(",结束于"),不能用于程序正文的其它地方"
int main(void)
{
n = 12;
{
int n = 6; //局部变量,局部作用域
printf("%d\n", n); //输出结果为6,这是因为在内层声明了n而导致外层的全局变量在这里被屏蔽
}
//上一个大括号嵌套结束,大括号内n的作用域到此结束,存储空间被释放
{
n = 8;
printf("%d\n", n); //输出结果为8,这是因为内层没有声明n,所以用的是外层的n
}
printf("%d\n", n); //输出结果为8
printf("%d\n", Pow(2, 5)); //输出结果为32
return 0;
}
int Pow(int x, int n) //函数的形参和下面函数里定义的变量都只在这个函数内有效,属于局部作用域
{
int ans;
ans = 1;
for(int k,i=1;i<=n;i++) //这个k和i只在这个for循环里面有效
{
ans *= x;
k = 15;
}
//printf("%d\n", k); 非法,“k”: 未声明的标识符
return ans;
}