1. 程式人生 > >C語言中的子函式和主函式有什麼聯絡啊?它們是怎麼編寫的?

C語言中的子函式和主函式有什麼聯絡啊?它們是怎麼編寫的?

函式定義的一般形式

1.無參函式的一般形式
型別說明符 函式名()
{
型別說明
語句
}
  其中型別說明符和函式名稱為函式頭。 型別說明符指明瞭本函式的型別,函式的型別實際上是函式返回值的型別。 該型別說明符與第二章介紹的各種說明符相同。 函式名是由使用者定義的識別符號,函式名後有一個空括號,其中無引數,但括號不可少。{} 中的內容稱為函式體。在函式體中也有型別說明, 這是對函式體內部所用到的變數的型別說明。在很多情況下都不要求無參函式有返回值, 此時函式型別符可以寫為void。
我們可以改為一個函式定義:
void Hello()
{
printf ("Hello,world /n");
}
 這裡,只把main改為Hello作為函式名,其餘不變。Hello 函式是一個無參函式,當被其它函式呼叫時,輸出Hello world字串。

2.有參函式的一般形式
型別說明符 函式名(形式引數表)
型式引數型別說明
{
型別說明
語句
}
  有參函式比無參函式多了兩個內容,其一是形式引數表, 其二是形式引數型別說明。在形參表中給出的引數稱為形式引數, 它們可以是各種型別的變數, 各引數之間用逗號間隔。在進行函式呼叫時,主調函式將賦予這些形式引數實際的值。 形參既然是變數,當然必須給以型別說明。例如,定義一個函式, 用於求兩個數中的大數,可寫為:
int max(a,b)
int a,b;
{
if (a>b) return a;
else return b;
}
  第一行說明max函式是一個整型函式,其返回的函式值是一個整數。形參為a,b。第二行說明a,b均為整型量。 a,b 的具體值是由主調函式在呼叫時傳送過來的。在{}中的函式體內, 除形參外沒有使用其它變數,因此只有語句而沒有變數型別說明。 上邊這種定義方法稱為“傳統格式”。 這種格式不易於編譯系統檢查,從而會引起一些非常細微而且難於跟蹤的錯誤。ANSI C 的新標準中把對形參的型別說明合併到形參表中,稱為“現代格式”。
  例如max函式用現代格式可定義為:
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
  現代格式在函式定義和函式說明(後面將要介紹)時, 給出了形式引數及其型別,在編譯時易於對它們進行查錯, 從而保證了函式說明和定義的一致性。例1.3即採用了這種現代格式。 在max函式體中的return語句是把a(或b)的值作為函式的值返回給主調函式。有返回值函式中至少應有一個return語句。 在C程式中,一個函式的定義可以放在任意位置, 既可放在主函式main之前,也可放在main之後。例如例1.3中定義了一個max 函式,其位置在main之後, 也可以把它放在main之前。
修改後的程式如下所示。
int max(int a,int b)
{
if(a>b)return a;
else return b;
}
void main()
{
int max(int a,int b);
int x,y,z;
printf("input two numbers:/n");
scanf("%d%d",&x,&y);
z=max(x,y);
printf("maxmum=%d",z);
}
  現在我們可以從函式定義、 函式說明及函式呼叫的角度來分析整個程式,從中進一步瞭解函式的各種特點。程式的第1行至第5行為max函式定義。進入主函式後,因為準備呼叫max函式,故先對max函式進行說明(程式第8行)。函式定義和函式說明並不是一回事,在後面還要專門討論。 可以看出函式說明與函式定義中的函式頭部分相同,但是末尾要加分號。程式第12 行為呼叫max函式,並把x,y中的值傳送給max的形參a,b。max函式執行的
結果 (a或b)將返回給變數z。最後由主函式輸出z的值。

  函式呼叫的一般形式前面已經說過,在程式中是通過對函式的呼叫來執行函式體的,其過程與其它語言的子程式呼叫相似。C語言中, 函式呼叫的一般形式為:

  函式名(實際引數表) 對無參函式呼叫時則無實際引數表。 實際引數表中的引數可以是常數,變數或其它構造型別資料及表示式。 各實參之間用逗號分隔。'Next of Page在C語言中,可以用以下幾種方式呼叫函式:
1.函式表示式
  函式作表示式中的一項出現在表示式中,以函式返回值參與表示式的運算。這種方式要求函式是有返回值的。例如: z=max(x,y)是一個賦值表示式,把max的返回值賦予變數z。'Next of Page
2.函式語句
  函式呼叫的一般形式加上分號即構成函式語句。例如: printf ("%D",a);scanf ("%d",&b);都是以函式語句的方式呼叫函式。
3.函式實參
  函式作為另一個函式呼叫的實際引數出現。 這種情況是把該函式的返回值作為實參進行傳送,因此要求該函式必須是有返回值的。例如: printf("%d",max(x,y)); 即是把max呼叫的返回值又作為printf函式的實參來使用的。在函式呼叫中還應該注意的一個問題是求值順序的問題。 所謂求值順序是指對實參表中各量是自左至右使用呢,還是自右至左使用。 對此, 各系統的規定不一定相同。在3.1.3節介紹printf 函式時已提
到過,這裡從函式呼叫的角度再強調一下。 看例5.2程式。
void main()
{
int i=8;
printf("%d/n%d/n%d/n%d/n",++i,--i,i++,i--);
}
如按照從右至左的順序求值。例5.2的執行結果應為:
8
7
7
8
如對printf語句中的++i,--i,i++,i--從左至右求值,結果應為:
9
8
8
9
  應特別注意的是,無論是從左至右求值, 還是自右至左求值,其輸出順序都是不變的, 即輸出順序總是和實參表中實參的順序相同。由於Turbo C現定是自右至左求值,所以結果為8,7,7,8。上述問題如還不理解,上機一試就明白了。函式的引數和函式的值
一、函式的引數
  前面已經介紹過,函式的引數分為形參和實參兩種。 在本小節中,進一步介紹形參、實參的特點和兩者的關係。 形參出現在函式定義中,在整個函式體內都可以使用, 離開該函式則不能使用。實參出現在主調函式中,進入被調函式後,實參變數也不能使用。 形參和實參的功能是作資料傳送。發生函式呼叫時, 主調函式把實參的值傳送給被調函式的形參從而實現主調函式向被調函式的資料傳送。

  函式的形參和實參具有以下特點:
1.形參變數只有在被呼叫時才分配記憶體單元,在呼叫結束時, 即刻釋放所分配的記憶體單元。因此,形參只有在函式內部有效。 函式呼叫結束返回主調函式後則不能再使用該形參變數。

2.實參可以是常量、變數、表示式、函式等, 無論實參是何種型別的量,在進行函式呼叫時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應預先用賦值,輸入等辦法使實參獲得確定值。

3.實參和形參在數量上,型別上,順序上應嚴格一致, 否則會發生“型別不匹配”的錯誤。

4.函式呼叫中發生的資料傳送是單向的。 即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。 因此在函式呼叫過程中,形參的值發生改變,而實參中的值不會變化。例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);
}
本程式中定義了一個函式s,該函式的功能是求∑ni=1i 的值。在主函式中輸入n值,並作為實參,在呼叫時傳送給s 函式的形參量n( 注意,本例的形參變數和實參變數的識別符號都為n, 但這是兩個不同的量,各自的作用域不同)。 在主函式中用printf 語句輸出一次n值,這個n值是實參n的值。在函式s中也用printf 語句輸出了一次n值,這個n值是形參最後取得的n值0。從執行情況看,輸入n值為100。即實參n的值為100。把此值傳給函式s時,形參 n 的初值也為100,在執行函式過程中,形參n的值變為5050。 返回主函式之後,輸出實參n的值仍為100。可見實參的值不隨形參的變化而變化。