局部变量
保证了函数的独立性
- 定义在函数内部的变量
- 还允许定义作用再复合语句中的局部变量
- 一般定义在函数或复合语句开头处
全局变量
- 定义在函数外而不属于任何函数的变量
- 一般定义在函数的最前面
- 但局部变量和全局变量重名时,在函数内部以局部变量为准
例5-7
#include<stdio.h>
int x;
int f();
int main()
{
int a=1;
x=a; //全局变量x
a=f();
{
int b=2;
b=a+b; //局部变量运算
x=x+b; //全局变量运算
}
printf("%d %d ",a,x);
return 0;
}
int f()
{
int x=4; //x为局部变量
return x;
}
4 7
例5-8
#include<stdio.h>
float cash;
void income(float number),expend(float number);
int main()
{
int choice;
float value;
cash=0;
printf("Enter (0-end,1-income,2-expend):");
scanf("%d",&choice);
while(choice!=0){
if(choice==1||choice==2){
printf("Enter cash value:" );
scanf("%f",&value);
if(choice==1)
income(value);
else
expend(value);
printf("current cash:%.2f\n",cash);
}
printf("Enter (0-end,1-income,2-expend):");
scanf("%d",&choice);
}
return 0;
}
void income(float number)
{
cash=cash+number;
}
void expend(float number)
{
cash=cash-number;
}
Enter (0-end,1-income,2-expend):1
Enter cash value:1000
current cash:1000.00
Enter (0-end,1-income,2-expend):2
Enter cash value:456
current cash:544.00
Enter (0-end,1-income,2-expend):0
变量生存周期
变量从定义开始分配储存单元,到运行结束存储单元被回收
根据这种特性,局部变量又称为自动变量
例如:auto int x,y; auto可以省略。
变量存储的内存分布
动态存储区是是使用堆栈来管理的
静态变量
存放在静态存储区,它的生命周期会持续到程序结束。
stastic 类型名 变量表
例5-9
#include<stdio.h>
double fact_s(int n);
int main()
{
int i,n;
printf("Input n: ");
scanf("%d",&n);
for(i=1; i<=n; i++)
printf("%3d!=%.0f\n",i,fact_s(i));
return 0;
}
double fact_s(int n)
{
static double f=1; //定义静态变量
f=f*n; //调用上次的值再乘以n
return (f);
}
Input n: 6
1!=1
2!=2
3!=6
4!=24
5!=120
6!=720
练习5-2
//将f定义成全局变量可以实现n!
#include<stdio.h>
int f=1;
double fact_s(int n);
int main()
{
int i,n;
printf("Input n: ");
scanf("%d",&n);
for(i=1; i<=n; i++)
printf("%3d!=%.0f\n",i,fact_s(i));
return 0;
}
double fact_s(int n)
{
f=f*n;
return (f);
}
Input n: 6
1!=1
2!=2
3!=6
4!=24
5!=120
6!=720
//把f换成普通局部变量不能实现n!,因为它不能像静态局部变量一样调用上一次的函数值
#include<stdio.h>
double fact_s(int n);
int main()
{
int i,n;
printf("Input n: ");
scanf("%d",&n);
for(i=1; i<=n; i++)
printf("%3d!=%.0f\n",i,fact_s(i));
return 0;
}
double fact_s(int n)
{
int f=1;
f=f*n;
return (f);
}
Input n: 6
1!=1
2!=2
3!=3
4!=4
5!=5
6!=6