# 4.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】
~~~
main(){
int i=8;
printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i--);
}
~~~
如按照從右至左的順序求值。運行結果應為:
? ? 8
??? 7
??? 7
??? 8
如對printf語句中的++i,--i,i++,i--從左至右求值,結果應為:
??? 9
??? 8
??? 8
??? 9
應特別注意的是,無論是從左至右求值, 還是自右至左求值,其輸出順序都是不變的,即輸出順序總是和實參表中實參的順序相同。由于Turbo C現定是自右至左求值,所以結果為8,7,7,8。上述問題如還不理解,上機一試就明白了。
## 被調用函數的聲明和函數原型
在主調函數中調用某函數之前應對該被調函數進行說明(聲明),這與使用變量之前要先進行變量說明是一樣的。在主調函數中對被調函數作說明的目的是使編譯系統知道被調函數返回值的類型,以便在主調函數中按此種類型對返回值作相應的處理。其一般形式為:
??????? 類型說明符 ?被調函數名( 類型 形參, 類型 形參… );?
或為:
??????? 類型說明符 ?被調函數名( 類型, 類型…);?
括號內給出了形參的類型和形參名,或只給出形參類型。這便于編譯系統進行檢錯,以防止可能出現的錯誤。
【例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命令包含在源文件前部。
- 前言
- 一. C語言概述
- 1.C語言的發展及其版本
- 2.C語言工作原理和運行機制
- 3.C語言編譯器(開發工具|IDE)推薦
- 4.C語言的特點
- 5.第一個C語言程序
- 6.C語言輸出函數(printf)和輸入函數(scanf)
- 7.C語言程序的結構特點
- 8.C語言字符集
- 9.C語言詞匯
- 二. C語言算法
- 1.什么是算法|算法的概念
- 2.簡單的C語言算法舉例
- 3.C語言算法的特性
- 4.用流程圖表示算法
- 5.三種基本結構的流程圖
- 6.用N-S流程圖表示算法
- 7.用計算機語言表示算法
- 三. 數據類型和運算符
- 1.C語言的數據類型
- 2.C語言常量與變量
- 3.C語言整型數據
- 4.C語言實型數據
- 5.C語言字符型數據
- 6.C語言變量賦初值
- 7.C語言數據類型轉換
- 8.C語言算術運算符和算術表達式
- 9.C語言賦值運算符和賦值表達式
- 10.C語言逗號運算符和逗號表達式
- 四. 順序程序設計
- 1.C語言語句概述
- 2.C語言賦值語句詳解
- 3.C語言數據的輸入輸出
- 4.C語言字符的輸入輸出
- 7.C語言順序結構程序設計舉例
- 五. 分支結構
- 1.C語言關系運算符和表達式
- 2.C語言邏輯運算符和表達式
- 3.C語言if語句詳解
- 4.C語言switch語句的用法詳解
- 5.C語言條件運算符和條件表達式
- 6.C語言分支結構程序舉例
- 六. 循環控制
- 1.C語言循環控制概述
- 2.C語言goto語句以及用goto語句構成循環
- 3.C語言while語句的用法
- 4.C語言do-while語句的用法
- 5.C語言for語句用法詳解
- 6.C語言幾種循環的比較
- 7.C語言break和continue語句的用法
- 8.C語言循環控制程序舉例
- 七. C語言數組
- 1.C語言一維數組的定義和引用
- 2.C語言二維數組的定義和引用
- 3.C語言字符數組及其應用
- 4.C語言常用字符串處理函數
- 5.C語言數組應用舉例
- 6.C語言數組小結
- 八. C語言函數
- 1.C語言函數概述
- 2.C語言函數的定義
- 3.C語言函數的參數和返回值
- 4.C語言函數的調用
- 5.C語言函數的嵌套調用
- 6.C語言函數的遞歸調用
- 7.C語言數組作為函數參數
- 8.C語言局部變量和全局變量
- 9.C語言變量的存儲類別
- 九. 預處理命令
- 1.C語言預處理概述
- 2.C語言無參數宏定義
- 3.C語言帶參數宏定義
- 4.C語言文件包含命令
- 5.C語言條件編譯詳解
- 6.C語言預處理指令總結
- 十. C語言指針
- 1.C語言指針的概念
- 2.C語言指針變量
- 3.C語言指針變量作為函數參數
- 4.C語言指針變量的運算
- 5.C語言數組指針
- 6.C語言通過指針引用數組
- 7.C語言數組名作函數參數
- 8.C語言指向多維數組的指針
- 9.C語言字符串指針
- 10.C語言字符串指針變量與字符數組的區別
- 11.C語言函數指針變量
- 12.C語言指針型函數
- 13.C語言指針數組的概念
- 14.C語言指向指針的指針
- 15.C語言main函數參數
- 16.關于指針的總結
- 十一. 結構體和共用體
- 1.C語言結構體的定義
- 2.C語言結構類型變量的說明
- 3.C語言結構變量成員的表示方法
- 4.C語言結構變量的賦值
- 5.C語言結構變量的初始化
- 6.C語言結構體數組的定義
- 7.C語言指向結構體變量的指針
- 8.C語言指向結構體數組的指針
- 9.C語言結構體指針變量作函數參數
- 10.C語言動態存儲分配
- 11.C語言鏈表的概念
- 12.C語言枚舉類型
- 13.C語言類型定義符typedef
- 十二. 位運算
- 1.C語言位運算符詳解
- 2.C語言位域(位段)
- 3.關于位運算的總結
- 十三. 文件操作
- 1.C語言文件概述
- 2.C語言文件指針
- 3.C語言文件的打開與關閉
- 4.C語言文件的讀寫
- 5.C語言文件的隨機讀寫
- 6.C語言文件檢測函數
- 7.C語言庫文件(頭文件)有哪些
- 8.文件操作小結