二、函數的值
函數的值是指函數被調用之後, 執行函數體中的程序段所取得的並返回給主調函數的值。如調用正弦函數取得正弦值,調用例5.1的max函數取得的最大數等。對函數的值(或稱函數返回值)有以下一些說明:
1. 函數的值只能通過return語句返回主調函數。return 語句的一般形式為:
return 表達式;
或者為:
return (表達式);
該語句的功能是計算表達式的值,並返回給主調函數。 在函數中允許有多個return語句,但每次調用只能有一個return 語句被執行, 因此只能返回一個函數值。
2. 函數值的類型和函數定義中函數的類型應保持一致。 如果兩者不一致,則以函數類型為准,自動進行類型轉換。
3. 如函數值為整型,在函數定義時可以省去類型說明。
4. 不返回函數值的函數,可以明確定義為“空類型”, 類型說明符為“void”。如例5.3中函數s並不向主函數返函數值,因此可定義為:
void s(int n)
{ ……
}
一旦函數被定義為空類型後, 就不能在主調函數中使用被調函數的函數值了。例如,在定義s為空類型後,在主函數中寫下述語句 sum=s(n); 就是錯誤的。為了使程序有良好的可讀性並減少出錯, 凡不要求返回值的函數都應定義為空類型。函數說明在主調函數中調用某函數之前應對該被調函數進行說明, 這與使用變量之前要先進行變量說明是一樣的。 在主調函數中對被調函數作說明的目的是使編譯系統知道被調函數返回值的類型, 以便在主調函數中按此種類型對返回值作相應的處理。 對被調函數的說明也有兩種格式,一種為傳統格式,其一般格式為: 類型說明符 被調函數名(); 這種格式只給出函數返回值的類型,被調函數名及一個空括號。
這種格式由於在括號中沒有任何參數信息, 因此不便於編譯系統進行錯誤檢查,易於發生錯誤。另一種為現代格式,其一般形式為:
類型說明符 被調函數名(類型 形參,類型 形參…);
或為:
類型說明符 被調函數名(類型,類型…);
現代格式的括號內給出了形參的類型和形參名, 或只給出形參類型。這便於編譯系統進行檢錯,以防止可能出現的錯誤。例5.1 main函數中對max函數的說明若
用傳統格式可寫為:
int max();
用現代格式可寫為:
int max(int a,int b);
或寫為:
int max(int,int);
C語言中又規定在以下幾種情況時可以省去主調函數中對被調函數的函數說明。
1. 如果被調函數的返回值是整型或字符型時, 可以不對被調函數作說明,而直接調用。這時系統將自動對被調函數返回值按整型處理。例5.3的主函數中未對函數s作說明而直接調用即屬此種情形。
2. 當被調函數的函數定義出現在主調函數之前時, 在主調函數中也可以不對被調函數再作說明而直接調用。例如例5.1中, 函數max的定義放在main 函數之前,因此可在main函數中省去對 max函數的函數說明int max(int a,int b)。
3. 如在所有函數定義之前, 在函數外預先說明了各個函數的類型,則在以後的各主調函數中,可不再對被調函數作說明。例如:
char str(int a);
float f(float b);
main()
{
……
}
char str(int a)
{
……
}
float f(float b)
{
……
}
其中第一,二行對str函數和f函數預先作了說明。 因此在以後各函數中無須對str和f函數再作說明就可直接調用。
4. 對庫函數的調用不需要再作說明, 但必須把該函數的頭文件用include命令包含在源文件前部。數組作為函數參數數組可以作為函數的參數使用,進行數據傳送。 數組用作函數參數有兩種形式,一種是把數組元素(下標變量)作為實參使用; 另一種是把數組名作為函數的形參和實參使用。一、數組元素作函數實參數組元素就是下標變量,它與普通變量並無區別。 因此它作為函數實參使用與普通變量是完全相同的,在發生函數調用時, 把作為實參的數組元素的值傳送給形參,實現單向的值傳送。例5.4說明了這種情況。[例5.4]判別一個整數數組中各元素的值,若大於0 則輸出該值,若小於等於0則輸出0值。編程如下:
void nzp(int v)
{
if(v>0)
printf("%d ",v);
else
printf("%d ",0);
}
main()
{
int a[5],i;
printf("input 5 numbers\n");
for(i=0;i<5;i++)
{
scanf("%d",&a[i]);
nzp(a[i]);
}
}void nzp(int v)
{ ……
}
main()
{
int a[5],i;
printf("input 5 numbers\n");
for(i=0;i<5;i++)
{ scanf("%d",&a[i]);
nzp(a[i]);
}
}
本程序中首先定義一個無返回值函數nzp,並說明其形參v 為整型變量。在函數體中根據v值輸出相應的結果。在main函數中用一個for 語句輸入數組各元素, 每輸入一個就以該元素作實參調用一次nzp函數,即把a[i]的值傳送給形參v,供nzp函數使用。