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