第59节 全局变量和局部变量

一.体验局部变量和全局变量

#include <stdio.h>
void fun1();
void fun2();
int main()
{
	int x = 1;
	x++;
	printf("%d\n", x); //x=2;
	fun1();
	printf("%d\n", x); //fun1()执行后,内存被释放;
	fun2();        
	printf("%d\n", x); //fun2()执行后,内存被释放;
	return 0;
}
void fun1()
{
	int x = 1;
	x += 3;
}
void fun2()
{
	int x = 1;
	x += 7;
}
运行结果:
2
2
2
#include <stdio.h>
void fun1();
void fun2();
int x = 1;
int main()
{
	x++;
	printf("%d\n", x); //x = 2;
	fun1();
	printf("%d\n", x); //x = 5;
	fun2();        
	printf("%d\n", x); //x =12;
	return 0;
}
void fun1()
{
	x += 3;
}
void fun2()
{
	x += 7;
}
运行结果:
2
5
12

二.变量的作用域及分类
1.每一个变量都有其有效作用的范围,称为变量的作用域;按作用域区分,变量分为局部变量和全局变量.
2.局部变量(local variable) local [ˈləʊkl]局部的; variable [ˈveriəbl] 变量;
2.1在一个函数内部定义的变量只在本函数范围内有效;
2.2在复合语句中定义的变量只在本复合语句范围内有效;
3.全局变量(global variable) global [ˈɡləʊbl]全局的,全面的; variable [ˈveriəbl] 变量;
3.1在函数之外定义的变量是全局变量,其有效范围为从定义位置开始到本源文件结束。

float f1(int a)
{
	int b,c;  //b,c在f1中有效;
	...
}
char f2(int x, int y)
{
	int i,j; //i,j在f2中有效;
	...
}
int main( )
{
	int m,n; //m,n在main()中有效;
	...
	{
	int p,q; //p,q在符合语句中有效;
	...
	}
}

三.不同作用域中的同名变量

#include <stdio.h>
void f(int a);
int main()
{
	int x = 10;
	{
		int x = 20;
		printf("%d\n", x);// 20,局部变量更优先
	}
	f(x);
	printf("%d\n", x); //10,其它局部变量x不影响mai()中x值;
	return 0;
}
void f(int a)
{
	int x;
	x = a + 20;
	printf("%d\n", x); //30 ,10+20=30
}
运行结果:
20
30
10

结论:不同的函数及作用域中可以使用相同名字的局部变量,它们在内存中分属不同的存储区间,互不干扰。

四.全局变量会降低程序可读性

#include <stdio.h>
int max(int x, int y);
int min;
int main ()
{
	int a,b,c;
	scanf_s("%d %d", &a, &b);
	c = max(a, b) ;
	printf("Max: %d Min: %d\n", c, min);
	return 0;
}
int max(int x, int y)
{
	int z;
	z=(x>y)? x : y ;
	min = (x<y)? x : y ; //此处不利于理解,阅读性不好;
	return z;
}

以上程序风格极端不好,更不提倡;

#include <stdio.h>
int max(int x, int y);
int min(int x, int y);
int main()
{
	int a, b, c, d;
	scanf_s("%d %d", &a, &b);
	c = max(a, b);
	d = min(a, b);
	printf("Max: %d Min: %d\n", c, d);
	return 0;
}
int max(int x, int y)
{
	int z;
	z = (x > y) ? x : y;
	return z;
}
int min(int x, int y)
{
	int z;
	z = (x < y) ? x : y; 
	return z;
}

改进后的程序,更好理解,不易出错;

五.要限制使用全局变量
①空间效率:全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。
②高耦合:全局变量使函数的通用性降低了
 函数执行时要受到外部变量的影响
 将一个函数移到另一个文件中时,易发生变量同名的冲突。
③可读性:使用全局变量过多,会降低程序的清晰性
 各个函数都能修改全局变量的值…
 设计原则——高内聚、低耦合
 反例:赤壁之战的关键——战船相连

上一篇:59.函数作用域


下一篇:理顺 JavaScript (9) - Date 类