变量的作用域
凡是在{}以内的变量为局部变量,也包括形式参数。
凡是{}外的变量为全局变量
作用域:
{}以内的作用域为局部作用域,主要包含的事变量
{}以外的作用域为全局作用域,包含的是变量和函数
同一作用域内,不可以用重命名的变量
局部变量的作用域,起始于定义处,直到所在的大括号处结束。
全局变量的作用域,起始与定义处,知道本文件结束。
作用域叠加:
全局变量同局部变量的作用域叠加,在不同的作用域中,可以有重名的标识符,局部变量会覆盖全局变量的作用域。
#include<stdio.h>
int a = 100;
int main() {
int a = 10;
printf("a = %d\n",a);//10
return 0;
}
更小的作用域{}只能再次划分局部作用域
#include<stdio.h>
int a = 100;
int main() {
int a = 10;
{//只能用于局部
int a = 1;
printf("a = %d\n",a);//1
}
return 0;
}
全局变量命名污染
函数是全据变量,要防止命名污染,全局变量的使用更要避免命名重名。尽量少用全局变量。
局部变量的生命周期
函数的生命周期起始与调用,结束与调用结束。函数体内的局部变量相同。 main函数比较特殊它开始于程序的开始,结束语程序的结束
全局变量的生命周期
全局变量的生命周期起始与main函数的调用,结束于main函数的结束,等价于程序的生命周期。 main函数中的变量生命周期与全局变量相同,但他们的作用域不同
修饰符
auto类型
只能用于修饰局部变量,表示该变量存储在栈上stack 特点:随用随开,用完消失
默认的局部变量,就是auto类型,所以通常将其省略。C++中auto是自动变量。
eg:
auto int a = 23;
register
只能修饰局部变量,将内存中的变量升级到cpu寄存器中存储,这样访问速度会很快。存储cpu的变量,速度快但数量有限,通常用来优化。用于频繁使用的变量。一般不用。
extern(通关文牒)
修饰全局变量,
c语言是订单文件编译,然后再将编译的.o文件同库仪器连接成可执行文件,所以跨文件需要声明。 区分声明预定义:extern可以省略,不建议省略
eg:
int a;//声明
int a = 120;//定义
全局变量声明未定义时是0,局部变量是随机数。vs中是不行的。局部变量必须定义。
static(隔离出境)
static修饰局部变量,默认初始化0
#include<stdio.h>
void func();
int main() {
for(int i = 0;i < 10;i++) {
func();
}
return 0;
}
void func() {
int a = 1;//默认auto修饰,存储在栈中即用即消失,所以每次用完消失++操作无效。
printf("a = %d\t",a++);
static int b = 1;//修饰的局部变量存放在data块中,生命周期等同与进程。
//无论以后调用多少次函数,它的初始化一次
printf("b = %d\n",b++);
printf("++++++++++++++++++");
}
/*
a = 1 b = 1
++++++++++++++++++
a = 1 b = 2
++++++++++++++++++
a = 1 b = 3
++++++++++++++++++
a = 1 b = 4
++++++++++++++++++
a = 1 b = 5
++++++++++++++++++
a = 1 b = 6
++++++++++++++++++
a = 1 b = 7
++++++++++++++++++
a = 1 b = 8
++++++++++++++++++
a = 1 b = 9
++++++++++++++++++
a = 1 b = 10
++++++++++++++++++
*/
static修饰的变量存储在data区域中,生命周期等同于进程,和函数的作用域无关
#include<stdio.h>
void print(int num,int age,char sex,float score);
int main() {
print(1001,32,'x',99);
print(1001,32,'x',99);
print(1001,32,'x',99);
print(1001,32,'x',99);
print(1001,32,'x',99);
print(1001,32,'x',99);
print(1001,32,'x',99);
print(1001,32,'x',99);
print(1001,32,'x',99);
print(1001,32,'x',99);
}
void print(int num,int age,char sex,float score) {
static int flag = 1;
if(flag == 1) {
printf("num\tage\tsex\tscore\tcount\n");
flag = 0;
}
static int count = 0;
printf("%d\t%d\t%c\t%.2f\t%d\n",num,age,sex,score,++count);
}
//控制执行次数,记录打印某函数的调用次数多用于避免多次加载的资源
全局变量会带来命名污染,好处(全局可用,避免传参),用static解决。一个全局变量拥有外延性,可以被其他的文件所用,extern。static修饰全局变量以后,外延性消失,变成本文件内部的全局变量
main.c
static int a = 100;
bb.c
static int a = 200;
这样两者文件中的a都限制在本文件中
main.c
extern a;
printf("a = %d\n",a);//报错,编译不通过
bb.c
static int a = 200;//限制了外延性,成了局部变量
同样适用于函数
全局变量被static修饰后,存放的位置没有变,改变的了作用域,外延性被限制。
|
请发表评论