變程序量中使用的范圍不同:作用域(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;
}