C語言中的庫函數(shù)眾多,但是僅僅是這些庫函數(shù)设江,遠(yuǎn)遠(yuǎn)不能滿足我們編程時(shí)對于函數(shù)的需求,所以我們需要學(xué)習(xí)自定義函數(shù)攘轩,自立門派叉存。掌握自定義函數(shù)也有助于我們理解庫函數(shù)的運(yùn)作原理度帮。
我們?nèi)绾蝿?chuàng)建一個(gè)函數(shù)呢?
一個(gè)基本的函數(shù)應(yīng)當(dāng)由函數(shù)名、返回值類型腺晾、函數(shù)參數(shù)、函數(shù)體組成鼻由。函數(shù)名就是函數(shù)的名字窟感,方便我們調(diào)用它哈误,函數(shù)名要避免與庫函數(shù)蜜自、關(guān)鍵字虚茶、已經(jīng)定義過的函數(shù)名重名仇参。一個(gè)函數(shù)一般會(huì)有一個(gè)返回值怕磨,可以理解為調(diào)用函數(shù)后產(chǎn)生的結(jié)果消约,它的數(shù)據(jù)類型就是返回值類型(也可以沒有返回值导饲,此時(shí)返回值類型為void)。函數(shù)參數(shù)分為實(shí)際參數(shù)和形式參數(shù)贱除,具體見后文。函數(shù)體就是我們函數(shù)中的內(nèi)容。一般函數(shù)的返回值用return關(guān)鍵字引出录语,寫成return+返回值,如果有return語句蒲稳,return語句就是函數(shù)結(jié)束的標(biāo)志
定義函數(shù)語法:
返回值類型 函數(shù)名 (形式參數(shù))
{
函數(shù)體倍踪;
( return 返回值;)
}
給出有返回值類型函數(shù)樣例:
寫一個(gè)函數(shù)可以判斷一個(gè)數(shù)是不是素?cái)?shù)
#include<stdio.h>
#include<math.h>
int sushu(int x)
{
int i = 0;
for (i = 2; i <= sqrt(x); i++)
{
if (x % i == 0)
return 0;
}
return 1;
}
1
2
3
4
5
6
7
8
9
10
11
12
在這里插入圖片描述
上面的函數(shù)的意思就是:如果是素?cái)?shù)就返回1领斥,不是就返回0孽锥。需要注意的是碎节,看似我們寫了兩個(gè)返回值的語句陌僵,但實(shí)際上我們只可能在同一時(shí)間得到一個(gè)返回值总滩,當(dāng)我們r(jià)eturn 0時(shí)席函,函數(shù)已經(jīng)結(jié)束督弓,不會(huì)再執(zhí)行下面的return 1,當(dāng)我們r(jià)eturn 1時(shí)妈踊,說明函數(shù)一次都沒有讀到return 0。關(guān)于函數(shù)體的意思假哎,前文已經(jīng)細(xì)致的講解了判斷素?cái)?shù)的流程迅腔,不再贅述靠娱。
給出無返回值類型函數(shù)樣例:
#include<stdio.h>
void hhh()
{
printf("哈哈哈\n");
}
1
2
3
4
5
這個(gè)函數(shù)并沒有返回任何值沧烈,但這不妨礙它是一個(gè)函數(shù)
函數(shù)的使用
函數(shù)聲明
函數(shù)必須先聲明再使用,聲明的意思就是告訴編譯器有這個(gè)函數(shù)的存在像云,然后我們才能使用它锌雀。函數(shù)的聲明和函數(shù)的定義是兩回事,函數(shù)聲明是讓函數(shù)存在的語句迅诬,函數(shù)定義是賦予函數(shù)意義的語句腋逆。
語法:
返回值類型 函數(shù)名 (形式參數(shù)類型);
用下面的例子來加深一下理解:
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
int Add(int, int);
printf("%d", Add(a, b));
}
int Add(int x, int y)
{
return x + y;
}
1
2
3
4
5
6
7
8
9
10
11
12
在這里插入圖片描述
程序都是進(jìn)主函數(shù)開始百框,出主函數(shù)結(jié)束闲礼,由于我們的Add函數(shù)定義在主函數(shù)的后面,所以如果我們不事先聲明它铐维,程序?qū)⒚媾R一次都沒有見過Add函數(shù)就要調(diào)用它的局面柬泽,那就會(huì)報(bào)錯(cuò)(現(xiàn)在有些比較智能的編譯器已經(jīng)不會(huì)報(bào)錯(cuò)了,但是我們需要養(yǎng)成好的代碼風(fēng)格嫁蛇,請堅(jiān)持先聲明再使用的原則)锨并。
為什么我們平常寫函數(shù)一般都不需要聲明呢?因?yàn)槿绻瘮?shù)在主函數(shù)之前定義的話睬棚,定義本身就是一種強(qiáng)有力的聲明:
#include<stdio.h>
int Add(int x, int y)
{
return x + y;
}
int main()
{
int a = 1;
int b = 2;
printf("%d", Add(a, b));
}
1
2
3
4
5
6
7
8
9
10
11
在這里插入圖片描述
傳值調(diào)用
傳值調(diào)用是最基礎(chǔ)的函數(shù)使用方法第煮,意思就是我們只是把參數(shù)的值傳給了函數(shù),所以函數(shù)怎樣處理這個(gè)值是函數(shù)的事兒抑党,并不會(huì)改變原函數(shù)中的參數(shù)值包警。我們在文章開始寫的判斷素?cái)?shù)的函數(shù)就是傳值調(diào)用:
#include<stdio.h>
#include<stdio.h>
#include<math.h>
int sushu(int x)
{
int i = 0;
for (i = 2; i <= sqrt(x); i++)
{
if (x % i == 0)
return 0;
}
return 1;
}
int main()
{
int a = 0;
printf("打印100-200間的素?cái)?shù):\n");
for (a = 101; a < 200; a += 2)
{
if (sushu(a))
printf("%d ", a);
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
在這里插入圖片描述
在這里插入圖片描述
在上面這個(gè)程序中,a是負(fù)責(zé)傳給函數(shù)值的參數(shù)底靠;x是我們在函數(shù)中定義的害晦,作用域僅在這個(gè)函數(shù)內(nèi)部的,負(fù)責(zé)接收a的值并執(zhí)行函數(shù)中語句的參數(shù)暑中。我們把a(bǔ)叫做實(shí)際參數(shù)壹瘟,把x叫做形式參數(shù)。實(shí)際參數(shù)a和形式參數(shù)x是兩個(gè)不同的參數(shù)鳄逾,它們在內(nèi)存中會(huì)被分配不同的空間稻轨,所以實(shí)際參數(shù)a不會(huì)受到形式參數(shù)x的影響,而形式參數(shù)x由于有時(shí)需要接收實(shí)際參數(shù)a的值雕凹,所以會(huì)實(shí)際參數(shù)a的改變會(huì)影響形式參數(shù)x殴俱。我們可以把形式參數(shù)x當(dāng)成實(shí)際參數(shù)a的一份臨時(shí)拷貝政冻。