函數(shù)的意義
- 函數(shù)解決了代碼段復(fù)用的問題:相同功能的代碼段可以直接重復(fù)使用,相似的或者僅僅是某個參數(shù)不同的依疼,可以用帶參數(shù)的函數(shù)解決妹蔽。
- 函數(shù)減少了代碼的總長度聪黎,因為重復(fù)的只出現(xiàn)一次。
- 函數(shù)讓主調(diào)用代碼或主調(diào)用函數(shù)的結(jié)構(gòu)更加清晰忘渔。
- 當(dāng)軟件開發(fā)是多個人時高帖,相互之間可以通過函數(shù)調(diào)用提高開發(fā)效率。
函數(shù)的定義和使用
函數(shù)是一塊代碼畦粮,接受零個或多個參數(shù)散址,做一件事情,并返回零個或一個值宣赔。
函數(shù)的定義
<返回類型> 函數(shù)名稱([<參數(shù)類型> 參數(shù)名稱, ...]) // 函數(shù)頭:返回值類型预麸,函數(shù)名稱,參數(shù)表
{
函數(shù)體
}
注意
- 沒有返回值的函數(shù)
- 函數(shù)沒有返回值儒将,使用
void
進行標(biāo)識吏祸;即void 函數(shù)名(參數(shù)列表)
- 不能使用帶值的return,也可以沒有
return
語句 - 調(diào)用沒有返回值的函數(shù)時钩蚊,不能進行賦值操作
2.有返回值的函數(shù)
- 函數(shù)體內(nèi)必須有帶值的
return
語句
函數(shù)調(diào)用
函數(shù)名稱(函數(shù)的yi參數(shù)表);
注意
- 調(diào)用函數(shù)時贡翘,
()
起到了表示函數(shù)調(diào)用的重要作用,即使沒有參數(shù)也需要()
砰逻。 - 函數(shù)如果有參數(shù)鸣驱,調(diào)用時,需要給出正確的數(shù)量和順序蝠咆。
- 當(dāng)函數(shù)有返回值時踊东,
return
為函數(shù)返回標(biāo)記,return
關(guān)鍵字停止函數(shù)的執(zhí)行,并返回一個值递胧。 - 一個函數(shù)中可以出現(xiàn)多個
return
語句
函數(shù)的參數(shù)和變量
函數(shù)的原型
對于C語言編譯器來說是自上而下順序分析程序猿編寫的代碼碑韵,因此函數(shù)有先后關(guān)系。
在進行函數(shù)調(diào)用時缎脾,必須要知道函數(shù)的基本信息:返回值祝闻、函數(shù)名稱、參數(shù)個數(shù)遗菠、參數(shù)類型联喘、參數(shù)順序,為了解決這個問題辙纬,主要有兩種方式:
- 函數(shù)定義在函數(shù)調(diào)用之前豁遭;
- 通過函數(shù)原型進行聲明。
函數(shù)原型的語法:
使用函數(shù)頭贺拣,并以分號;
結(jié)尾蓖谢,就構(gòu)成了函數(shù)的原型
函數(shù)原型的目的:
告訴編譯器函數(shù)的基本信息:名稱、參數(shù)(數(shù)量及類型)譬涡、返回值類型
注意
- 函數(shù)調(diào)用時闪幽,會根據(jù)函數(shù)原型進行自動類型轉(zhuǎn)換。
- 函數(shù)原型的位置建議放在頭文件之后(也可以放在對應(yīng)函數(shù)體內(nèi)的首行涡匀,但是不推薦)盯腌。
- 函數(shù)原型中可以將函數(shù)參數(shù)名省略掉,但是為了程序的可讀性陨瘩,建議函數(shù)聲明與函數(shù)定義時的函數(shù)頭保持一致腕够。
參數(shù)傳遞
如果函數(shù)有參數(shù),進行函數(shù)調(diào)用時必須傳遞給它數(shù)量舌劳、類型正確的值(實參)帚湘。
值(實參)的類型有:
- 字面量
- 變量
- 函數(shù)的返回值
- 計算的結(jié)果
當(dāng)傳遞的參數(shù)的類型不匹配時,將怎么辦蒿囤?
調(diào)用函數(shù)時給的值與參數(shù)的類型不匹配是C語言傳統(tǒng)的漏洞客们,C語言的編譯器總是會進行自動類型轉(zhuǎn)換,以至于最終的結(jié)果往往不符合預(yù)期材诽。函數(shù)調(diào)用時底挫,傳遞過去的內(nèi)容是什么?
C語言在調(diào)用函數(shù)時脸侥,傳遞的內(nèi)容是值建邓。
傳值過程中,有如下注意事項:
- 每個函數(shù)都有自己的變量空間睁枕,參數(shù)(形參)也位于這個獨立的空間中官边,和其他函數(shù)沒有關(guān)系沸手。
- 形式參數(shù)(參數(shù));實際參數(shù)(值)
本地變量
函數(shù)的每次運行會產(chǎn)生一個獨立的變量空間注簿,在這個空間中的變量契吉,是函數(shù)的這次運行獨有的,稱作本地變量诡渴。函數(shù)中的參數(shù)也是本地變量捐晶。
本地變量的性質(zhì):
- 生存期:什么時候這個變量開始出現(xiàn)了,到什么時候它消亡了妄辩。
- 作用域:在代碼的什么范圍內(nèi)可以訪問這個變量(這個變量可以起作用)
區(qū)分規(guī)則:大括號{}
——塊
本地變量的規(guī)則:
- 本地變量是定義在塊內(nèi)的
定義在函數(shù)的塊內(nèi)
定義在語句的塊內(nèi)
定義在某一對大括號內(nèi) - 程序運行進入這個塊之前惑灵,其中的變量不存在,離開這個塊后就消失了
- 塊外面定義的變量在塊內(nèi)仍然有效
- 塊內(nèi)定義的變量覆蓋了塊外同名的變量
- 不能在同一個塊內(nèi)定同名的變量
- 本地變量不會默認(rèn)初始化
函數(shù)小細(xì)節(jié)
沒有參數(shù)的函數(shù)
定義沒有參數(shù)的函數(shù)時眼耀,使用如下:
// 函數(shù)聲明
<返回值類型> 函數(shù)名稱(void)英支;
// 函數(shù)定義
<返回值類型> 函數(shù)名稱(void) {
函數(shù)體
}
<返回值類型> 函數(shù)名稱();
參數(shù)列表位置表什么也沒有寫,它表示參數(shù)的參數(shù)表未知哮伟,并不表示沒有參數(shù)干花。
#include <stdio.h>
void print(int a, int b);
int main()
{
int a, b;
a = 5;
b = 6;
print(a, b); // 正常輸出:第一個參數(shù):5, 第二個參數(shù):6
return 0;
}
void print(int a, int b)
{
printf("第一個參數(shù):%d, 第二個參數(shù):%d\n", a, b);
}
進行如下修改:
#include <stdio.h>
void print();
int main()
{
int a, b;
a = 5;
b = 6;
print(a, b); // 編譯時報錯或運行時出現(xiàn)bug
return 0;
}
void print(double a, double b)
{
printf("第一個參數(shù):%lf, 第二個參數(shù):%lf\n", a, b);
}
部分編譯器直接報錯,部分編譯器將能夠運行澈吨,但是運行結(jié)果錯誤把敢,出現(xiàn)bug
逗號運算符 VS 函數(shù)調(diào)用時的逗號
- 函數(shù)調(diào)用時的逗號表示標(biāo)點符號
- 逗號運算符表示一個運算符
函數(shù)里的函數(shù)
C語言中不允許函數(shù)嵌套定義,但是可以進行在某個函數(shù)內(nèi)進行函數(shù)聲明谅辣。
關(guān)于main函數(shù)
C語言中main()
函數(shù)是程序的入口函數(shù),這個是針對程序猿來說的婶恼。對于整個程序來說桑阶,main
函數(shù)不是程序運行的首條指令。
main
函數(shù)中的return
信息是有效的勾邦,返回0表示正常結(jié)束蚣录;返回非0表示異常結(jié)束。main
函數(shù)的return
信息是在編寫批處理文件(如.sh眷篇,.bat等文件)時使用萎河。