变量类型
由变量作用域划分,变量分为全局变量和局部变量
变量作用域
含义:变量的有效范围
全局变量(全程变量)
定义:在函数外定义的变量
作用域:从定义变量的位置到本源文件结束
注:作用域是从变量定义的位置开始的!在变量定义前即使是全局变量也无法被调用
局部变量
定义:在函数/复合语句内部定义的变量
作用域:从定义的位置到函数/复合语句结束
注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.可读性降低:使用全局变量过多,会降低程序的清晰性(多个函数都能修改全局变量的值。。。。)
程序设计应尽量遵循的原则:高内聚、低耦合