做電影解析網(wǎng)站網(wǎng)站推廣100種方法
? ? ? ? ? ? ?? ? ? ? ?? ? ? ? ? ? ?
づ?ど
?🎉?歡迎點(diǎn)贊支持🎉
文章目錄
前言
一、return語句
二、數(shù)組做函數(shù)參數(shù)
三、嵌套調(diào)用和鏈?zhǔn)皆L問
3.1 嵌套調(diào)用
3.2 鏈?zhǔn)皆L問
四、函數(shù)聲明和定義
4.1 單個(gè)文件
4.2 多個(gè)文件
總結(jié)
前言
大家好啊,繼我們上一次講的函數(shù)(1)已經(jīng)過了兩周了,不知道大家掌握的怎么樣,由于要期末考試,我斷更了兩周,希望大家見諒,那么我們接著上一章節(jié)來繼續(xù)說說函數(shù)的內(nèi)容吧。我們這一章節(jié)就來看看return語句和數(shù)組傳參及嵌套調(diào)用和鏈?zhǔn)皆L問等問題,接下來我們來一起學(xué)習(xí)本次的內(nèi)容。
一、return語句
我們在使用函數(shù)的過程中,總是使用到return語句,例如
int Add(int a, int b)
{int c = a + b;return c;
}
既然return這么重要,那它到底怎么使用呢,我們來了解了解。
1. return后面可以是一個(gè)數(shù)值,也可以是一個(gè)表達(dá)式,但是如果return后面是表達(dá)式的話要先計(jì)算表達(dá)式的內(nèi)容,在返回結(jié)果。
2. return后面可以什么都沒有,直接寫return,這種寫法適合函數(shù)返回類型是void(無類型返回)的情況
3. return返回的值和函數(shù)返回的類型不一致,系統(tǒng)會自動返回的值轉(zhuǎn)換成函數(shù)返回的類型。
4. return執(zhí)行后,函數(shù)就徹底返回,后面的代碼不執(zhí)行。
5. 如果函數(shù)中出現(xiàn)了if分支,要確保每個(gè)分支都有返回的情況,不然程序會報(bào)錯(cuò)。
我來一條一條的為大家解釋。
首先是第一條,我們可以從上節(jié)課的代碼就能知道,return可以直接返回?cái)?shù)值,也可以返回一個(gè)表達(dá)式。
int Add(int a, int b)
{int c = a + b;return c;
}
int Add(int a, int b)
{return a + b;
}
表達(dá)式是先通過計(jì)算出結(jié)果后才返回最終的值的,這很好理解,就不多贅述。
其次是第2條也很好理解,函數(shù)本身是不需要任何的返回類型的,那return后面肯定什么也不能加的,可能會有人疑問那這個(gè)return加在這個(gè)函數(shù)里面有什么用,當(dāng)然是有用的這個(gè)就可以和第4點(diǎn)結(jié)合起來,它可以直接中斷函數(shù)而不繼續(xù)運(yùn)行下面的代碼。這就是這個(gè)return的作用。
void Print(int n)
{if (n <= 0){return;}for (int i = 1; i <= n; i++){printf("%d ", i);}
}int main()
{int n = 0;scanf("%d", &n);Print(n);return 0;
}
我們可以來看這個(gè)代碼,這個(gè)代碼的目的是如果n>0就把1~n的數(shù)字打印出來,我們可以來看這個(gè)打印的函數(shù)Print就可以看到,如果n<=0就return,我們可以來看看這個(gè)return后還會不會繼續(xù)運(yùn)行函數(shù)下面的代碼了。
可以看到,我輸入一個(gè)正數(shù)它很好的打印出來了,那我輸入一個(gè)負(fù)數(shù)或者0會怎么樣呢?
很顯然,它什么都沒有輸出,這就是return的強(qiáng)大,它比break都強(qiáng),break是跳出循環(huán),而return是直接跳出函數(shù)。
我們現(xiàn)在來看看第3點(diǎn),其實(shí)也很好理解,就是如果return返回的類型和函數(shù)要求的返回類型不一樣是會轉(zhuǎn)換成函數(shù)類型。
char test(char a)
{int b = a;return b;
}int main()
{char a;scanf("%c", &a);int b = sizeof(test(a));printf("%d", b);return 0;
}
我們可以來看看這個(gè)代碼,我們先輸入一個(gè)字符,然后寫一個(gè)函數(shù),這個(gè)函數(shù)的返回類型是字符型,但是我卻返回了一個(gè)整型,那我們來看看它到底返回的是字符還是整型吧,我們可以知道字符的sizeof是1,而整型是大于等于2。
可以看到是1,所以返回回來的是字符型。也就是函數(shù)要求的返回類型。
最后我們來看看第5點(diǎn),其實(shí)也很簡單,你想想,如果一個(gè)要求要返回內(nèi)容的函數(shù)卻沒有返回內(nèi)容會怎么辦,肯定會出現(xiàn)問題啊,可能你十分肯定不會有其他情況發(fā)生,但是萬一呢,萬一發(fā)生了呢,可能你會想那再改嘛,但是給了用戶后發(fā)生這種情況導(dǎo)致程序崩潰了,那是多大的損失啊。所以為了防止這種事情的發(fā)生,函數(shù)中如果有if,那必須都有返回值,不然程序會報(bào)錯(cuò)的。
二、數(shù)組做函數(shù)參數(shù)
我們在使用函數(shù)的過程之中,難免會使用到數(shù)組做參數(shù),就比如說我們?nèi)绻雽懸粋€(gè)函數(shù),讓它把數(shù)組里的數(shù)據(jù)都變成0,那就得把數(shù)組傳參到函數(shù)中,那我們接下來了解了解數(shù)組如何傳參吧。
我們可以先來寫兩個(gè)關(guān)于數(shù)組傳參的函數(shù),第一個(gè)就是把數(shù)組里的數(shù)據(jù)都變成0的函數(shù),第二個(gè)則是打印數(shù)組的函數(shù)。
int main()
{int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };set_arr(); //把數(shù)組里的數(shù)據(jù)都變成0print_arr(); //打印數(shù)組的函數(shù)return 0;
}
我們可以先來想想,如果我們要去讓數(shù)組內(nèi)的數(shù)據(jù)都變成0的話,肯定還是要知道數(shù)組里的元素個(gè)數(shù)的,而且我們之前傳實(shí)參的時(shí)候都是在()內(nèi)輸入要傳過去的東西的名字的,按道理來講數(shù)組也是這樣的,我們之前說過數(shù)組的名是[ ]前的,也就是arr,所以說最后就變成了這樣。
int main()
{int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int sz = sizeof(arr) / sizeof(arr[0]); //求元素的個(gè)數(shù)set_arr(arr, sz); //把數(shù)組里的數(shù)據(jù)都變成0print_arr(arr, sz); //打印數(shù)組的函數(shù)return 0;
}
這就是實(shí)參的寫法,實(shí)參傳輸過去變成形參啦,那形參該怎么寫呢?我們參考上一章節(jié)的內(nèi)容就可以知道其實(shí)很簡單,唯一困難的地方就是不知道數(shù)組該用什么類型來表示。這里我們來復(fù)習(xí)一下我們前面講數(shù)組是說數(shù)組是什么類型的啊,除去我們命名的東東其他的就是它的類型,比如我們這里的arr它的類型是int [ ],那我們的形參是不是 int [ ] arr呢,答案肯定是否定的,其實(shí)沒有那么復(fù)雜,直接就是數(shù)組啥樣它啥樣就行了,數(shù)組是int arr[ ],那形參也是int arr[ ];當(dāng)然,如果你想換個(gè)名字,比如說int brr[ ]也可以。所以說最終函數(shù)長這樣。
void set_arr(int arr[], int sz)
{for (int i = 0; i < sz; i++){arr[i] = 0;}
}void print_arr(int arr[], int sz)
{for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}
}int main()
{int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int sz = sizeof(arr) / sizeof(arr[0]); //求元素的個(gè)數(shù)set_arr(arr, sz); //把數(shù)組里的數(shù)據(jù)都變成0print_arr(arr, sz); //打印數(shù)組的函數(shù)return 0;
}
這就是數(shù)組的傳參方式,當(dāng)然,不知這一種,等我們學(xué)到指針時(shí)還有其他的辦法會更實(shí)用一點(diǎn)。當(dāng)然,數(shù)組這里還有幾個(gè)重要的知識點(diǎn)得掌握。
1. 函數(shù)的形式參數(shù)要和函數(shù)的實(shí)際參數(shù)相匹配。
也就是說實(shí)參傳了兩個(gè)參數(shù)過去,那形參就一定要用兩個(gè)參數(shù)接收,不能多也不能少。
2. 函數(shù)的實(shí)參是數(shù)組,形參也是可以寫成數(shù)組的形式的。
3. 形參如果是一維數(shù)組,那數(shù)組的大小可以省略不寫。
也就和我上面的相同,[ ]中沒有數(shù)組的大小,當(dāng)然如果寫了也無傷大雅。
4. 形參如果是二維數(shù)組,行可以省略,但是列不行,就和創(chuàng)建二維數(shù)組相同。
5. 數(shù)組傳參,形參是不會創(chuàng)建新數(shù)組的。
也就是說實(shí)參的數(shù)組和形參的數(shù)組是一個(gè)數(shù)組,而不是和上節(jié)課那樣只是數(shù)據(jù)相同,但不是同一個(gè)東西,數(shù)組就是同一個(gè)數(shù)組。
6. 形參操作的數(shù)組和實(shí)參操作的數(shù)組是同一個(gè)數(shù)組。
同上面同理。
三、嵌套調(diào)用和鏈?zhǔn)皆L問
3.1 嵌套調(diào)用
嵌套調(diào)用就是函數(shù)之間相互調(diào)用,就像孔明鎖或者魯班鎖,各種不同的結(jié)構(gòu)相互平湊在一起,形成了一個(gè)非常穩(wěn)固的結(jié)構(gòu)。而正是因?yàn)楹瘮?shù)之間有效的相互調(diào)用才形成了相對的的程序。
假如我們要寫一個(gè)程序,要讓它求出某年某月有多少天怎么做呢?我們來看一下。
int main()
{int years = 0;int month = 0;scanf("%d %d", &years, &month);int day = get_month_day(years, month); // 用來求某年某月有多少天的函數(shù)printf("%d", day);return 0;
}
這是主函數(shù),我們可以先創(chuàng)建一個(gè)函數(shù)來解決這個(gè)問題,我們來分析一下這個(gè)問題,其實(shí)很簡單,月份基本上是固定的,唯一一個(gè)不固定的月份就是二月,閏年二月29天,平年二月28天,所以問題就變成了一個(gè)找閏年的問題,我們可以再創(chuàng)建一個(gè)函數(shù)來判斷是不是閏年。
int is_leap_year(int y) //是閏年返回1,不是返回0
{if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0){return 1;}else{return 0;}
}
int get_month_day(int y, int m)
{int arr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//由于arr的下標(biāo)是從0開始的,所以說我們可以空一位,讓下標(biāo)0變成0if (is_leap_year(y) == 1 && m == 2){return arr[m] + 1;}else{return arr[m];}
}int main()
{int years = 0;int month = 0;scanf("%d %d", &years, &month);int day = get_month_day(years, month); // 用來求某年某月有多少天的函數(shù)printf("%d", day);return 0;
}
我們可以得到以上的函數(shù),這就能很好的滿足我們的要求,這就是嵌套調(diào)用。
當(dāng)然還可以用switch,大家可以去試一試,這里就不帶大家嘗試了。
大家要注意函數(shù)不能嵌套定義,就是說在一個(gè)函數(shù)中在定義一個(gè)函數(shù)是萬分不可的。
3.2 鏈?zhǔn)皆L問
鏈?zhǔn)皆L問就是值把一個(gè)函數(shù)的返回值作為一個(gè)函數(shù)的參數(shù),像鏈條一樣將函數(shù)串起來就是鏈?zhǔn)皆L問。
就比如我們之前玩過的strlen函數(shù),它的作用是求字符串長度
int main()
{int a = strlen("ABCDEFG");printf("%d\n", a);return 0;
}
這個(gè)代碼很容易懂,就是求出ABCDEFG的大小后存儲在a中,然后再用printf函數(shù)輸出出來。
可能有人就在想了,能不能直接把strlen寫在printf里面,不用a保存,比如
int main()
{printf("%d\n", strlen("ABCDEFG"));return 0;
}
當(dāng)然可以,這就是一個(gè)鏈?zhǔn)皆L問,將strlen函數(shù)的返回值放在printf的參數(shù)之中。
四、函數(shù)聲明和定義
4.1 單個(gè)文件
我們在創(chuàng)建函數(shù)的時(shí)候一般都是把函數(shù)寫在主程序的前面,例如
int Add(int a, int b) //函數(shù)的定義
{return a + b;
}int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);int c = Add(a, b);//函數(shù)的調(diào)用printf("%d", c);return 0;
}
我們把上面的函數(shù)叫做函數(shù)的定義,而下面引用函數(shù)的地方叫做函數(shù)的調(diào)用。但是我們其實(shí)也可以把函數(shù)寫在主函數(shù)的下面。
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);int c = Add(a, b);//函數(shù)的調(diào)用printf("%d", c);return 0;
}int Add(int a, int b) //函數(shù)的定義
{return a + b;
}
這個(gè)時(shí)候我們運(yùn)行代碼會發(fā)現(xiàn)程序報(bào)錯(cuò)了。
上面顯示說是Add未定義,原因是因?yàn)榫幾g器在從上往下編譯時(shí)發(fā)現(xiàn)主程序中有Add這個(gè)函數(shù),但是它在前面沒有看見過,所以就顯示未定義,這個(gè)時(shí)候我們就可以聲明一下。
int Add(int a, int b);//函數(shù)的聲明int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);int c = Add(a, b);//函數(shù)的調(diào)用printf("%d", c);return 0;
}int Add(int a, int b) //函數(shù)的定義
{return a + b;
}
這就是函數(shù)的聲明,這樣程序就能正常運(yùn)行了,當(dāng)然,函數(shù)的定義是特殊的函數(shù)聲明。
4.2 多個(gè)文件
其實(shí)我們一般在創(chuàng)建函數(shù)是都不會在一個(gè)文件中創(chuàng)建,一般會分為兩個(gè)文件
.h(頭文件) ---- 函數(shù)的聲明;
.c(源文件) ---- 函數(shù)的定義;
以上就是我們聲明函數(shù)的地方。
以上就是我們函數(shù)定義的地方。
我們在頭文件中聲明函數(shù),在源文件中定義函數(shù),最后再在我們的主文件中使用函數(shù),這就是多個(gè)文件的函數(shù)聲明和定義。
聲明:
定義:
使用:
在使用時(shí)要注意要引用我們自己創(chuàng)建的頭文件,我們自己的頭文件用" "來引用。
總結(jié)
以上就是函數(shù)的內(nèi)容啦,希望大家好好吸收和理解下一章節(jié)我來說說操作符吧。感謝大家的觀看,如果哪里有誤,歡迎支持,謝謝大家。