一、函數(shù)的參數(shù)
前面已經(jīng)介紹過,函數(shù)的參數(shù)分為形參和實參兩種。 在本小節(jié)中,進一步介紹形參、實參的特點和兩者的關系。 形參出現(xiàn)在函數(shù)定義中,在整個函數(shù)體內(nèi)都可以使用, 離開該函數(shù)則不能使用。實參出現(xiàn)在主調函數(shù)中,進入被調函數(shù)后,實參變量也不能使用。 形參和實參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調用時, 主調函數(shù)把實參的值傳送給被調函數(shù)的形參從而實現(xiàn)主調函數(shù)向被調函數(shù)的數(shù)據(jù)傳送。
函數(shù)的形參和實參具有以下特點:
1.形參變量只有在被調用時才分配內(nèi)存單元,在調用結束時, 即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。 函數(shù)調用結束返回主調函數(shù)后則不能再使用該形參變量。
2.實參可以是常量、變量、表達式、函數(shù)等, 無論實參是何種類型的量,在進行函數(shù)調用時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應預先用賦值,輸入等辦法使實參獲得確定值。 來源:www.examda.com
3.實參和形參在數(shù)量上,類型上,順序上應嚴格一致, 否則會發(fā)生“類型不匹配”的錯誤。
4.函數(shù)調用中發(fā)生的數(shù)據(jù)傳送是單向的。 即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。 因此在函數(shù)調用過程中,形參的值發(fā)生改變,而實參中的值不會變化。例5.3可以說明這個問題。
void main()
{
int n;
printf("input number\n");
scanf("%d",&n);
s(n);
printf("n=%d\n",n);
}
int s(int n)
{
int i;
for(i=n-1;i>=1;i--)
n=n+i;
printf("n=%d\n",n);
}
本程序中定義了一個函數(shù)s,該函數(shù)的功能是求∑ni=1i 的值。在主函數(shù)中輸入n值,并作為實參,在調用時傳送給s 函數(shù)的形參量n( 注意,本例的形參變量和實參變量的標識符都為n, 但這是兩個不同的量,各自的作用域不同)。 在主函數(shù)中用printf 語句輸出一次n值,這個n值是實參n的值。在函數(shù)s中也用printf 語句輸出了一次n值,這個n值是形參最后取得的n值0。從運行情況看,輸入n值為100。即實參n的值為100。把此值傳給函數(shù)s時,形參 n 的初值也為100,在執(zhí)行函數(shù)過程中,形參n的值變?yōu)?050。 返回主函數(shù)之后,輸出實參n的值仍為100。可見實參的值不隨形參的變化而變化。
二、函數(shù)的值
函數(shù)的值是指函數(shù)被調用之后, 執(zhí)行函數(shù)體中的程序段所取得的并返回給主調函數(shù)的值。如調用正弦函數(shù)取得正弦值,調用例5.1的max函數(shù)取得的數(shù)等。對函數(shù)的值(或稱函數(shù)返回值)有以下一些說明:
1. 函數(shù)的值只能通過return語句返回主調函數(shù)。return 語句的一般形式為:
return 表達式;
或者為:
return (表達式);
該語句的功能是計算表達式的值,并返回給主調函數(shù)。 在函數(shù)中允許有多個return語句,但每次調用只能有一個return 語句被執(zhí)行, 因此只能返回一個函數(shù)值。
2. 函數(shù)值的類型和函數(shù)定義中函數(shù)的類型應保持一致。 如果兩者不一致,則以函數(shù)類型為準,自動進行類型轉換。
3. 如函數(shù)值為整型,在函數(shù)定義時可以省去類型說明。
4. 不返回函數(shù)值的函數(shù),可以明確定義為“空類型”, 類型說明符為“void”。如例5.3中函數(shù)s并不向主函數(shù)返函數(shù)值,因此可定義為:
void s(int n)
{ ……
}
一旦函數(shù)被定義為空類型后, 就不能在主調函數(shù)中使用被調函數(shù)的函數(shù)值了。例如,在定義s為空類型后,在主函數(shù)中寫下述語句 sum=s(n); 就是錯誤的。為了使程序有良好的可讀性并減少出錯, 凡不要求返回值的函數(shù)都應定義為空類型。函數(shù)說明在主調函數(shù)中調用某函數(shù)之前應對該被調函數(shù)進行說明, 這與使用變量之前要先進行變量說明是一樣的。 在主調函數(shù)中對被調函數(shù)作說明的目的是使編譯系統(tǒng)知道被調函數(shù)返回值的類型, 以便在主調函數(shù)中按此種類型對返回值作相應的處理。 對被調函數(shù)的說明也有兩種格式,一種為傳統(tǒng)格式,其一般格式為: 類型說明符 被調函數(shù)名(); 這種格式只給出函數(shù)返回值的類型,被調函數(shù)名及一個空括號。
這種格式由于在括號中沒有任何參數(shù)信息, 因此不便于編譯系統(tǒng)進行錯誤檢查,易于發(fā)生錯誤。另一種為現(xiàn)代格式,其一般形式為:
類型說明符 被調函數(shù)名(類型 形參,類型 形參…);
或為:
類型說明符 被調函數(shù)名(類型,類型…);
現(xiàn)代格式的括號內(nèi)給出了形參的類型和形參名, 或只給出形參類型。這便于編譯系統(tǒng)進行檢錯,以防止可能出現(xiàn)的錯誤。例5.1 main函數(shù)中對max函數(shù)的說明若
用傳統(tǒng)格式可寫為:
int max();
用現(xiàn)代格式可寫為:
int max(int a,int b);
或寫為:
int max(int,int);
C語言中又規(guī)定在以下幾種情況時可以省去主調函數(shù)中對被調函數(shù)的函數(shù)說明。
前面已經(jīng)介紹過,函數(shù)的參數(shù)分為形參和實參兩種。 在本小節(jié)中,進一步介紹形參、實參的特點和兩者的關系。 形參出現(xiàn)在函數(shù)定義中,在整個函數(shù)體內(nèi)都可以使用, 離開該函數(shù)則不能使用。實參出現(xiàn)在主調函數(shù)中,進入被調函數(shù)后,實參變量也不能使用。 形參和實參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調用時, 主調函數(shù)把實參的值傳送給被調函數(shù)的形參從而實現(xiàn)主調函數(shù)向被調函數(shù)的數(shù)據(jù)傳送。
函數(shù)的形參和實參具有以下特點:
1.形參變量只有在被調用時才分配內(nèi)存單元,在調用結束時, 即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。 函數(shù)調用結束返回主調函數(shù)后則不能再使用該形參變量。
2.實參可以是常量、變量、表達式、函數(shù)等, 無論實參是何種類型的量,在進行函數(shù)調用時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應預先用賦值,輸入等辦法使實參獲得確定值。 來源:www.examda.com
3.實參和形參在數(shù)量上,類型上,順序上應嚴格一致, 否則會發(fā)生“類型不匹配”的錯誤。
4.函數(shù)調用中發(fā)生的數(shù)據(jù)傳送是單向的。 即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。 因此在函數(shù)調用過程中,形參的值發(fā)生改變,而實參中的值不會變化。例5.3可以說明這個問題。
void main()
{
int n;
printf("input number\n");
scanf("%d",&n);
s(n);
printf("n=%d\n",n);
}
int s(int n)
{
int i;
for(i=n-1;i>=1;i--)
n=n+i;
printf("n=%d\n",n);
}
本程序中定義了一個函數(shù)s,該函數(shù)的功能是求∑ni=1i 的值。在主函數(shù)中輸入n值,并作為實參,在調用時傳送給s 函數(shù)的形參量n( 注意,本例的形參變量和實參變量的標識符都為n, 但這是兩個不同的量,各自的作用域不同)。 在主函數(shù)中用printf 語句輸出一次n值,這個n值是實參n的值。在函數(shù)s中也用printf 語句輸出了一次n值,這個n值是形參最后取得的n值0。從運行情況看,輸入n值為100。即實參n的值為100。把此值傳給函數(shù)s時,形參 n 的初值也為100,在執(zhí)行函數(shù)過程中,形參n的值變?yōu)?050。 返回主函數(shù)之后,輸出實參n的值仍為100。可見實參的值不隨形參的變化而變化。
二、函數(shù)的值
函數(shù)的值是指函數(shù)被調用之后, 執(zhí)行函數(shù)體中的程序段所取得的并返回給主調函數(shù)的值。如調用正弦函數(shù)取得正弦值,調用例5.1的max函數(shù)取得的數(shù)等。對函數(shù)的值(或稱函數(shù)返回值)有以下一些說明:
1. 函數(shù)的值只能通過return語句返回主調函數(shù)。return 語句的一般形式為:
return 表達式;
或者為:
return (表達式);
該語句的功能是計算表達式的值,并返回給主調函數(shù)。 在函數(shù)中允許有多個return語句,但每次調用只能有一個return 語句被執(zhí)行, 因此只能返回一個函數(shù)值。
2. 函數(shù)值的類型和函數(shù)定義中函數(shù)的類型應保持一致。 如果兩者不一致,則以函數(shù)類型為準,自動進行類型轉換。
3. 如函數(shù)值為整型,在函數(shù)定義時可以省去類型說明。
4. 不返回函數(shù)值的函數(shù),可以明確定義為“空類型”, 類型說明符為“void”。如例5.3中函數(shù)s并不向主函數(shù)返函數(shù)值,因此可定義為:
void s(int n)
{ ……
}
一旦函數(shù)被定義為空類型后, 就不能在主調函數(shù)中使用被調函數(shù)的函數(shù)值了。例如,在定義s為空類型后,在主函數(shù)中寫下述語句 sum=s(n); 就是錯誤的。為了使程序有良好的可讀性并減少出錯, 凡不要求返回值的函數(shù)都應定義為空類型。函數(shù)說明在主調函數(shù)中調用某函數(shù)之前應對該被調函數(shù)進行說明, 這與使用變量之前要先進行變量說明是一樣的。 在主調函數(shù)中對被調函數(shù)作說明的目的是使編譯系統(tǒng)知道被調函數(shù)返回值的類型, 以便在主調函數(shù)中按此種類型對返回值作相應的處理。 對被調函數(shù)的說明也有兩種格式,一種為傳統(tǒng)格式,其一般格式為: 類型說明符 被調函數(shù)名(); 這種格式只給出函數(shù)返回值的類型,被調函數(shù)名及一個空括號。
這種格式由于在括號中沒有任何參數(shù)信息, 因此不便于編譯系統(tǒng)進行錯誤檢查,易于發(fā)生錯誤。另一種為現(xiàn)代格式,其一般形式為:
類型說明符 被調函數(shù)名(類型 形參,類型 形參…);
或為:
類型說明符 被調函數(shù)名(類型,類型…);
現(xiàn)代格式的括號內(nèi)給出了形參的類型和形參名, 或只給出形參類型。這便于編譯系統(tǒng)進行檢錯,以防止可能出現(xiàn)的錯誤。例5.1 main函數(shù)中對max函數(shù)的說明若
用傳統(tǒng)格式可寫為:
int max();
用現(xiàn)代格式可寫為:
int max(int a,int b);
或寫為:
int max(int,int);
C語言中又規(guī)定在以下幾種情況時可以省去主調函數(shù)中對被調函數(shù)的函數(shù)說明。