函數(shù)調(diào)用的一般形式前面已經(jīng)說過,在程序中是通過對(duì)函數(shù)的調(diào)用來執(zhí)行函數(shù)體的,其過程與其它語言的子程序調(diào)用相似。C語言中, 函數(shù)調(diào)用的一般形式為:
函數(shù)名(實(shí)際參數(shù)表) 對(duì)無參函數(shù)調(diào)用時(shí)則無實(shí)際參數(shù)表。 實(shí)際參數(shù)表中的參數(shù)可以是常數(shù),變量或其它構(gòu)造類型數(shù)據(jù)及表達(dá)式。 各實(shí)參之間用逗號(hào)分隔!疦ext of Page在C語言中,可以用以下幾種方式調(diào)用函數(shù):
1.函數(shù)表達(dá)式
函數(shù)作表達(dá)式中的一項(xiàng)出現(xiàn)在表達(dá)式中,以函數(shù)返回值參與表達(dá)式的運(yùn)算。這種方式要求函數(shù)是有返回值的。例如: z=max(x,y)是一個(gè)賦值表達(dá)式,把max的返回值賦予變量z!疦ext of Page
2.函數(shù)語句
函數(shù)調(diào)用的一般形式加上分號(hào)即構(gòu)成函數(shù)語句。例如: printf ("%D",a);scanf ("%d",&b);都是以函數(shù)語句的方式調(diào)用函數(shù)。
3.函數(shù)實(shí)參
函數(shù)作為另一個(gè)函數(shù)調(diào)用的實(shí)際參數(shù)出現(xiàn)。 這種情況是把該函數(shù)的返回值作為實(shí)參進(jìn)行傳送,因此要求該函數(shù)必須是有返回值的。例如: printf("%d",max(x,y)); 即是把max調(diào)用的返回值又作為printf函數(shù)的實(shí)參來使用的。在函數(shù)調(diào)用中還應(yīng)該注意的一個(gè)問題是求值順序的問題。 所謂求值順序是指對(duì)實(shí)參表中各量是自左至右使用呢,還是自右至左使用。 對(duì)此, 各系統(tǒng)的規(guī)定不一定相同。
到過,這里從函數(shù)調(diào)用的角度再?gòu)?qiáng)調(diào)一下。 看例5.2程序。
void main()
{
int i=8;
printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i--);
}
如按照從右至左的順序求值。例5.2的運(yùn)行結(jié)果應(yīng)為:
8
7
7
8
如對(duì)printf語句中的++i,--i,i++,i--從左至右求值,結(jié)果應(yīng)為:
9
8
8
9
應(yīng)特別注意的是,無論是從左至右求值, 還是自右至左求值,其輸出順序都是不變的, 即輸出順序總是和實(shí)參表中實(shí)參的順序相同。由于Turbo C現(xiàn)定是自右至左求值,所以結(jié)果為8,7,7,8。上述問題如還不理解,上機(jī)一試就明白了。函數(shù)的參數(shù)和函數(shù)的值
一、函數(shù)的參數(shù)
前面已經(jīng)介紹過,函數(shù)的參數(shù)分為形參和實(shí)參兩種。 在本小節(jié)中,進(jìn)一步介紹形參、實(shí)參的特點(diǎn)和兩者的關(guān)系。 形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用, 離開該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用。 形參和實(shí)參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時(shí), 主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。
函數(shù)的形參和實(shí)參具有以下特點(diǎn):
1.形參變量只有在被調(diào)用時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí), 即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。 函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。
2.實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等, 無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應(yīng)預(yù)先用賦值,輸入等辦法使實(shí)參獲得確定值。
3.實(shí)參和形參在數(shù)量上,類型上,順序上應(yīng)嚴(yán)格一致, 否則會(huì)發(fā)生“類型不匹配”的錯(cuò)誤。
4.函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的。 即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。 因此在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,而實(shí)參中的值不會(huì)變化。例5.3可以說明這個(gè)問題。
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);
}
本程序中定義了一個(gè)函數(shù)s,該函數(shù)的功能是求∑ni=1i 的值。在主函數(shù)中輸入n值,并作為實(shí)參,在調(diào)用時(shí)傳送給s 函數(shù)的形參量n( 注意,本例的形參變量和實(shí)參變量的標(biāo)識(shí)符都為n, 但這是兩個(gè)不同的量,各自的作用域不同)。 在主函數(shù)中用printf 語句輸出一次n值,這個(gè)n值是實(shí)參n的值。在函數(shù)s中也用printf 語句輸出了一次n值,這個(gè)n值是形參最后取得的n值0。從運(yùn)行情況看,輸入n值為100。即實(shí)參n的值為100。把此值傳給函數(shù)s時(shí),形參 n 的初值也為100,在執(zhí)行函數(shù)過程中,形參n的值變?yōu)?050。 返回主函數(shù)之后,輸出實(shí)參n的值仍為100?梢妼(shí)參的值不隨形參的變化而變化。
二、函數(shù)的值
函數(shù)的值是指函數(shù)被調(diào)用之后, 執(zhí)行函數(shù)體中的程序段所取得的并返回給主調(diào)函數(shù)的值。如調(diào)用正弦函數(shù)取得正弦值,調(diào)用例5.1的max函數(shù)取得的最大數(shù)等。對(duì)函數(shù)的值(或稱函數(shù)返回值)有以下一些說明:
1. 函數(shù)的值只能通過return語句返回主調(diào)函數(shù)。return 語句的一般形式為:
return 表達(dá)式;
或者為:
return (表達(dá)式);
該語句的功能是計(jì)算表達(dá)式的值,并返回給主調(diào)函數(shù)。 在函數(shù)中允許有多個(gè)return語句,但每次調(diào)用只能有一個(gè)return 語句被執(zhí)行, 因此只能返回一個(gè)函數(shù)值。
2. 函數(shù)值的類型和函數(shù)定義中函數(shù)的類型應(yīng)保持一致。 如果兩者不一致,則以函數(shù)類型為準(zhǔn),自動(dòng)進(jìn)行類型轉(zhuǎn)換。
3. 如函數(shù)值為整型,在函數(shù)定義時(shí)可以省去類型說明。
4. 不返回函數(shù)值的函數(shù),可以明確定義為“空類型”, 類型說明符為“void”。如例5.3中函數(shù)s并不向主函數(shù)返函數(shù)值,因此可定義為:
void s(int n)
{ ……
}
一旦函數(shù)被定義為空類型后, 就不能在主調(diào)函數(shù)中使用被調(diào)函數(shù)的函數(shù)值了。例如,在定義s為空類型后,在主函數(shù)中寫下述語句 sum=s(n); 就是錯(cuò)誤的。為了使程序有良好的可讀性并減少出錯(cuò), 凡不要求返回值的函數(shù)都應(yīng)定義為空類型。函數(shù)說明在主調(diào)函數(shù)中調(diào)用某函數(shù)之前應(yīng)對(duì)該被調(diào)函數(shù)進(jìn)行說明, 這與使用變量之前要先進(jìn)行變量說明是一樣的。 在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)作說明的目的是使編譯系統(tǒng)知道被調(diào)函數(shù)返回值的類型, 以便在主調(diào)函數(shù)中按此種類型對(duì)返回值作相應(yīng)的處理。 對(duì)被調(diào)函數(shù)的說明也有兩種格式,一種為傳統(tǒng)格式,其一般格式為: 類型說明符 被調(diào)函數(shù)名(); 這種格式只給出函數(shù)返回值的類型,被調(diào)函數(shù)名及一個(gè)空括號(hào)。
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |