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