变量的作用域
跳到导航
跳到搜索
https://www.bilibili.com/video/BV1vR4y1H7MY/?p=8
变量的作用域(可见性):每一个变量名都有一个作用域问题,即变量名在什么范围内有效。
- 全局变量:在函数外定义的变量。
- 局部变量:在函数中定义的变量。
- 程序块中的变量:在函数外部,在复合语句中定义的变量。函数内花括号中定义的变量叫作“块变量”。
#include<stdio.h>
int g_sum = 100; //全局变量
int main()
{
float ft = 12.23f; //局部变量
int a = 10;
int g_sum = 0; //局部变量和全局变量同名
a = g_sum; //? 100,0
return 0;
}
int g_max = 10;
void fun()
{
int a = g_max;
int sum = 0;
}
int main()
{
int x = g_max;
int sum = 10;
{
int z = 10;
z = 100;
//z的作用域仅在块内
}
//x = z + sum; //编译不通过
return 0;
}
int g_max = 10;
int main()
{
int a = 100;
int b = 200;
return 0;
}
int g_max = 100;
//相同作用域重复定义变量名编译不通过
#include<stdio.h>
int g_max = 10;
int main()
{
int a = 100;
int b = 200;
{
int a = 0;
printf("a = %d \n", a);
}
b = a + 10;
printf("b = %d \n", b);
return 0;
}
a = 0
b = 110
同名隐藏
如果在函数内定义了一个局部变量,在块内也定义了一个块内变量,当块内变量名与局部变量名同名时,进入块时,将把局部变量隐藏掉,使用的是块内变量。
#include<stdio.h>
int g_max = 10;
int main()
{
int a = 0;
int g_max = 100;
a = g_max;
printf("a = %d \n", a);
return 0;
}
a = 100
在函数外面定义了全局变量 g_max,在函数内也定义了一个局部变量 g_max,当局部变量与全局变量同名时,进入函数时,把全局变量隐藏掉,使用的是局部变量。
就近原则
向上就近
#include<stdio.h>
int g_max = 10;
int main()
{
int a = g_max;
int g_max = 100;
printf("a = %d \n", a);
return 0;
}
a = 10
“int a = g_max;”执行时,对 g_max 取值,根据“向上就近”的原则,取的值就是上面全局变量的“int g_max=10;”
#include<stdio.h>
int g_max = 10;
int main()
{
int a = g_max;
int g_max = 100;
printf("1 a = %d \n", a); //1
a = g_max;
printf("2 a = %d \n", a); //2
return 0;
}
1 a = 10
2 a = 100
第一次打印变量 a,向上就近全局变量 “int g_max = 10;”;
第二次打印变量 a,向上就近局部变量“int g_max = 100;”。
代码运行到“a = g_max”这一行时,全局变量 g_max 已经被隐藏了。
全局变量和局部变量发生命名冲突时,隐藏全局变量;
局部变量和块内变量发生命名冲突时,隐藏局部变量;
C++(.cpp)中的作用域解析符
#include<stdio.h>
int g_max = 10;
int main()
{
int a = g_max;
int g_max = 100;
printf("1 a = %d \n", a); //1
a = ::g_max;
printf("2 a = %d \n", a); //2
return 0;
}
1 a = 10
2 a = 10
“::”的意思是告诉编译器使用全局变量 g_max,但在C语言(.c)中是不被支持的。