局部变量和全局变量
变程序量中使用的范围不同:作用域(Scope),就是变量的有效范围。变量的作用域取决于变量的访问性。
局部变量:函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。
1.主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。
2.允许在不同的函数中使用相同的变量名,他们代表不同变量,分配不同的存放单元,互不相干,不会发生混淆。
3.复合语句中定义的变量,只限于使用当前函数中,也是复合语句的局部变量,复合语句:就是用{}包含起来的语句块。
4.形参变量、在函数体内定义的变量都是局部变量。实参给形参传值的过程也就是给局部变量赋值的过程。
#include <stdio.h>
void m();
void main(){
int a=1,b=2;
{
int a=3,b=4;
printf(复合语句的变量a=%d,b=%d\n",a,b);
}
printf("main函数的变量a=%d,b=%d\n",a,b);
m();
}
void m(){
int a=5,b=6;
printf("m函数的变量a=%d,b=%d\n",a,b);
}
}
全局变量:在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。它的作用域是从声明时刻开始,到程序结束。
1.全局变量定义必须在所有函数之外。
2.全局变量可加强函数模块之间的数据联系,但是函数又依赖这些变量,降低函数的独立性。
3.在同一源文件中,允许全局变量和局部变量同名,在局部变量作用域内,同名的全局变量不起作用。
int sum=0;//全局变量
void addNumbers(){
int sum;//局部变量
int num1,num2;
printf("\n请输入两个数;");
scanf("%d,%d",&num1,&num2);
sum=num1+num2;
}
void main(){
int sum=0;//局部变量
addNumbers();
printf("\n 主函数中 sum 的值是 %d \n ",sum);
}
示例:计算n的阶乘
#include <stdio.h>
int fun(int n);
void main(){
int n;
printf("请输入您要计算阶乘的数:\n");
scanf("%d",&n);
int sum=fun(n);
printf("%d的阶乘是%d",n,sum);
}
//计算阶乘
int fun(int n){
int sum=1;
while(n>1){
sum*=n;
n--;
}
return sum;
}
//博客评选大赛,10为评为为选手打分,去掉一个最高分和一个最低分,计算选手的最后得分。
#include <stdio.h>
void showMenu();
void getScores();
float calcAvg();
float scores[10];//定义全局变量,用于保存评委的打分
void main(){
float avg;
showMenu();//1.打印菜单
getScores();//2.获取评委分
avg=calcAvg();//计算选手的最后得分
printf("该选手去掉一个最高分和一个最低分最终得分为%.2f分\n",avg);
}
//1.打印菜单
void showMenu(){
printf("************************************************\n");
printf("*************杯博客大赛********************************\n");
printf("************************************************\n");
}
//获取评委分数
void getScores(){
int i;
for(i=0;i<10;i++){
printf("请%d号评委打分:\n",i+1);
scanf("%f",&scores[i]);//将评委的打分获取并保存到数组中
}
printf("评委打分完毕,分数正在紧张统计中.....\n");
}
//统计去掉一个最高分,一个最低分,选手得分
float calcAvg(){
float max,min,avg,sum=0;
int i;
min=max=scores[0];//假设第一个分数最高和最低分
for(i=0;i<10;I++){
sum+=scores[i];
if(scores[i]>max){//获取最高分
max=scoures[i];
}
if(scores[i]<min){//获取最低分
min=scoures[i];
}
}
//去除最高最低计算平均分
avg=(sum-max-min)/8;
return avg;
}