变量类型
由变量作用域划分,变量分为全局变量和局部变量
变量作用域
含义:变量的有效范围
全局变量(全程变量)
定义:在函数外定义的变量
作用域:从定义变量的位置到本源文件结束
注:作用域是从变量定义的位置开始的!在变量定义前即使是全局变量也无法被调用
局部变量
定义:在函数/复合语句内部定义的变量
作用域:从定义的位置到函数/复合语句结束
注1:局部变量在被定义时分配空间,当程序的执行离开变量的作用域时,变量的空间将被释放(和形参同理,因为形参也是局部变量)
注2:不同的函数及作用域中可以使用相同名字的局部变量,它们在内存中分属不同的存储区间,互不干扰
注3:当全局变量和局部变量同名时,对该名称变量的操作将优先使用局部变量,而全局变量将被屏蔽
代码示例:
#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试全局变量和局部变量
*/
void fun1();
void fun2();
int x1=1;//变量定义在main函数外,所以x1是全局变量
int main()
{
int x2=1;//变量定义在main函数内,所以x2是局部变量
x1++;
x2++;
printf("x1=%d\tx2=%d\n",x1,x2);
fun1();
printf("x1=%d\tx2=%d\n",x1,x2);
fun2();
printf("x1=%d\tx2=%d\n",x1,x2);
return 0;
}
void fun1()
{
int x2=1;
x2+=3;
x1+=3;
}
void fun2()
{
int x2=1;
x2+=7;
x1+=7;
}
结果:
解析:
如上所示,各个函数都能修改全局变量的值
全局函数和局部函数
示例代码:
#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试局部函数
*/
int main()
{
int gcd(int,int);//函数定义的位置在main函数内部,所以是局部函数
int lcm(int,int);
int num1=56,num2=80;
int iGcd,iLcm;
iGcd=gcd(num1,num2);
iLcm=lcm(num1,num2);
printf("%d,%d\n",iGcd,iLcm);
return 0;
}
int lcm(int n1,int n2)
{
return n1*n2/gcd(n1,n2);//此处调用gcd函数时,因为并不能在上方找到同名全局函数的声明,所以会报错。
}
int gcd(int n1,int n2)
{
int r;
while(n2!=0)
{
r=n1%n2;
n1=n2;
n2=r;
}
return n1;
}
编译时报错:
解析:
先声明(定义)后使用,这一点上变量和函数时相通的。
总结:
全局变量
优势:
增加函数间数据联系的渠道
劣势:
1.空间效率低:全局变量在程序的全部执行过程中都占用存储单元,而不是像局部变量那样只在需要时才开辟存储单元。
2.高耦合性:全局变量使函数的通用性降低了(函数执行时要受到外部变量的影响。。。。将一个函数移到另一文件中时,容易发生变量同名的冲突)
3.可读性降低:使用全局变量过多,会降低程序的清晰性(多个函数都能修改全局变量的值。。。。)
程序设计应尽量遵循的原则:高内聚、低耦合