我也不知道什麼時候該講這個問題,其實覺得一開始就應該講這個問題,但又覺得不太形象,所以我決定函數講完後就應該讓大家瞭解一下作用域的問題。
概述
當變量或者函數等聲明時,它只有在程序的一定區域才能被訪問。這個區域就是這個函數或者這個變量的作用域。
我們以下列代碼來講述作用域的問題:
#include<stdio.h>
int a;
void swap(int &d,int &e);
int largest_common_divisor(int b,int c);
int Least_common_multiple(int d,int e);
void swap(int &d,int &e)
{
int temp=d;
d=e;
e=temp;
}
int largest_common_divisor(int b,int c)
{
int temp;
if(b<c)
{
swap(b,c);
}
while(b%c!=0)
{
temp=c;
c=b%c;
b=temp;
}
return c;
}
int Least_common_multiple(int d,int e)
{
int sum=d*e;
return sum/largest_common_divisor(d,e);
}
int main()
{
int x,y;
scanf("%d%d",&x,&y);
printf("最大公約數爲%d\n",largest_common_divisor(x,y));
printf("最小公倍數爲%d\n",Least_common_multiple(x,y));
return 0;
}
這個程序是實現輸入兩個數求最大公約數和最小公倍數。這裏主要討論作用域的問題。
第三行的int a,在所有代碼以外,是全局變量。也就說在下面的所有代碼塊中都可以對它進行賦值等等的操作。
而函數中聲明的變量和函數的形參,都只在函數本身塊中使用,超過函數本身變量就失效了
大家可以自行體會一下這段程序以及變量的作用域。
函數同樣也有作用域,如果我不在最前面寫下下面的內容,函數的調用也可以能有問題。
void swap(int &d,int &e);
int largest_common_divisor(int b,int c);
int Least_common_multiple(int d,int e);
在上一章我講了函數的聲明方式,他其實類似變量,如果我沒有上面這一段函數聲明(一般在開發中這些聲明是放在自定義的頭文件裏的),又恰巧我把最大公約數(largest_common_divisor)和最小公倍數(Least_common_multiple)的函數對調一下的話,編譯器就會報錯說不知道最大公約數這個函數(未定義),所以作用域這個問題也是不可忽略的。
總結
本章介紹了變量和函數的作用域問題,其實覺得自己寫的不是太好,但是自己也沒有想到太好的例子來講這個東西,所以我們就先這樣提一下,有這個意識,後面大家就會去注意這個問題了。