四种作用域

当程序较大时,需要考虑将程序分解成若干个部分,此时文件和函数之间的标识符可能会遇到重名冲突,所以要对标识符的作用范围进行更为细致的考虑和规划。 根据C语言标识符的作用范围,可以将作用域分为4种:函数原型作用域,函数作用域,块作用域和文件作用域。下来我们就来介绍一下这四种作用域。

函数原型作用域

它指的是在声明函数原型时所指定的参数标识符的作用范围。因为作用范围是小括号内,所以函数原型声明中的标识符可以与函数定义中说明的标识符名称不同。只要让函数声明和函数定义中小括号内每个变量的类型及数目一致即可,也可以省略掉参数名(函数定义在后,调用在前)

double max(double x, double y);
double max(double, double);
//两者均可

块作用域

块作用域也称为局部作用域,也就是语句块的作用域。一般在函数中起到分割的作用。

{
	int a; //a的作用域起始处
	scanf("%d", &a);
	if(a < 0){    //b的作用域起始处
		int b;
		b -= a;
	}    //b的作用域结束处
}    //a的作用域结束处	
  • 当标识符的作用域完全相同时,不允许出现相同的标识符名,而当标识符有不同作用域时允许标识符同名。
  • 如果是作用域嵌套的情况下,如果内层和外层的作用域声明了同名的标识符,那么在外层作用域中声明的标识符对于该内层作用域时不可见的。也就是说,在内层中声明的变量i和外层变量i无关,当内层变量改变时,与之同名的外层变量的值不受影响。
    (在内层重定义时可以使用,要不然会改变外层变量的值)
Void fun(){
	int i = 0;
	{
		int i = 2;
		printf(“i2 = %d”, i);	//i的值为2
		i += 2;
	}
	printf(“i1 = %d”, i);	//i的值为0
}

函数作用域

在函数内部定义的一些变量,只能在函数内部使用。一旦离开了这个函数,就必须重新定义。可以把函数想成一个块。然后套用块作用域的定义。

文件作用域

在所有函数外定义的标识符称为全局标识符,定义的变量称为全局变量。全局标识符的作用域是文件作用域,即从它声明开始到文件结束都是可见的。标识符的文件作用域一般有一下三种情况。

  1. 全局常量或全局变量的作用域是从定义开始到源程序文件结束。
const float PI = 3.14;
int a = 0;
int main(){
.......
}
  1. 因为函数的定义中包含了函数声明,所以一旦声明了函数原型,函数标识符的作用域就从定义开始到源程序文件结束。
void funA(int x);   //函数funA的作用域从此开始到文件结束
void funB(){        //函数funB的作用域从此开始到文件结束
	/*...*/
}
int main(){
	/*.....*/
}
void funA(int x){
	/*......*/
}
  1. 对于在头文件中定义的标识符,当她们被预编译时,会将头文件的内容在源文件的相应位置展开,所以在头文件中定义的标识符的作用域可以看成从#include头文件开始的位置到源程序文件结束。
    例如:stdio.h里的printf和scanf的作用域就是从#include预处理指令开始一直到源程序文件结束。
  • 13
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值