程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言函數的調用

C語言函數的調用

編輯:關於C語言
 

前面已經說過,在程序中是通過對函數的調用來執行函數體的,其過程與其它語言的子程序調用相似。C語言中,函數調用的一般形式為:
    函數名(實際參數表);
對無參函數調用時則無實際參數表。實際參數表中的參數可以是常數,變量或其它構造類型數據及表達式。各實參之間用逗號分隔。
 

函數調用的方式

在C語言中,可以用以下幾種方式調用函數。

1) 函數表達式
函數作為表達式中的一項出現在表達式中,以函數返回值參與表達式的運算。這種方式要求函數是有返回值的。例如:

z=max(x,y);

是一個賦值表達式,把max的返回值賦予變量z。

2) 函數語句
函數調用的一般形式加上分號即構成函數語句。例如:

printf ("%d",a);
scanf ("%d",&b);

都是以函數語句的方式調用函數。

3) 函數實參
函數作為另一個函數調用的實際參數出現。這種情況是把該函數的返回值作為實參進行傳送,因此要求該函數必須是有返回值的。例如:

printf("%d",max(x,y));

即是把max調用的返回值又作為printf函數的實參來使用的。在函數調用中還應該注意的一個問題是求值順序的問題。所謂求值順序是指對實參表中各量是自左至右使用呢,還是自右至左使用。對此,各系統的規定不一定相同。介紹printf 函數時已提到過,這裡從函數調用的角度再強調一下。

【例8-3】在VC6.0下運行以下代碼。

#include <stdio.h>
int main(void){
    int i=8;
    printf("%d %d %d %d\n",++i,++i,--i,--i);
    return 0;
}

運行結果:
8 7 6 7

可見是按照從右至左的順序求值。

如果按照從左至右求值,結果應為:
9  10  9  8

應特別注意的是,無論是從左至右求值, 還是自右至左求值,其輸出順序都是不變的,即輸出順序總是和實參表中實參的順序相同。

經讀者 @尕妮 @懂你 @繁華 反饋,以前的代碼讓人費解,筆者已經進行了更改,更改時間為 2014-07-06。上面的示例和分析是最新的,老代碼就不提供了。
 

被調用函數的聲明和函數原型

在主調函數中調用某函數之前應對該被調函數進行說明(聲明),這與使用變量之前要先進行變量說明是一樣的。在主調函數中對被調函數作說明的目的是使編譯系統知道被調函數返回值的類型,以便在主調函數中按此種類型對返回值作相應的處理。其一般形式為:
        類型說明符  被調函數名( 類型 形參, 類型 形參… ); 
或為:
        類型說明符  被調函數名( 類型, 類型…); 
括號內給出了形參的類型和形參名,或只給出形參類型。這便於編譯系統進行檢錯,以防止可能出現的錯誤。

【例8-1】main函數中對max函數的說明為:

int max( int a, int b );

或寫為:

int max( int, int );


C語言中又規定在以下幾種情況時可以省去主調函數中對被調函數的函數說明。

1) 如果被調函數的返回值是整型或字符型時,可以不對被調函數作說明,而直接調用。這時系統將自動對被調函數返回值按整型處理。【例8-2】的主函數中未對函數s作說明而直接調用即屬此種情形。

2) 當被調函數的函數定義出現在主調函數之前時,在主調函數中也可以不對被調函數再作說明而直接調用。例如【例8-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函數再作說明就可直接調用。對庫函數的調用不需要再作說明,但必須把該函數的頭文件用include命令包含在源文件前部。

   
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved