变量的作用域

来自姬鸿昌的知识库
跳到导航 跳到搜索

https://www.bilibili.com/video/BV1vR4y1H7MY/?p=8

变量的作用域(可见性):每一个变量名都有一个作用域问题,即变量名在什么范围内有效。

  1. 全局变量:在函数外定义的变量。
  2. 局部变量:在函数中定义的变量。
  3. 程序块中的变量:在函数外部,在复合语句中定义的变量。函数内花括号中定义的变量叫作“块变量”。
#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)中是不被支持的。


全局变量未进行初始化是0,局部变量未初始化是随机值。