C語言超全面講解函數(shù)的使用方法下
一、函數(shù)的嵌套調(diào)用
在定義函數(shù)時,一個函數(shù)內(nèi)不能再定義另一個函數(shù),即不能嵌套定義,但可以嵌套調(diào)用函數(shù),即在調(diào)用一個函數(shù)的過程中,又調(diào)用另一個函數(shù)。

??注意:
- 函數(shù)可以嵌套調(diào)用但是不可以嵌套定義。
- 每一個函數(shù)都應(yīng)該在大括號的外面獨立存在。
代碼示例:

根據(jù)這張圖可以清楚的看到,three_line() 函數(shù)內(nèi)部嵌套了一個 new_line() 函數(shù)。
當前代碼打印了3個haha。
二、函數(shù)的鏈式訪問
函數(shù)的鏈式訪問就是把一個函數(shù)的返回值作為另一個函數(shù)的參數(shù)。

當前代碼,strlen()函數(shù)是作為printf()打印函數(shù)的參數(shù),把自己的返回值3返回給了printf()函數(shù),所以最終打印結(jié)果是:3。
下面代碼的打印結(jié)果是什么?
#include<stdio.h>
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
return 0;
}輸出結(jié)果:

代碼分析:
??注意:printf()函數(shù)的返回值是打印字符的個數(shù)。
當?shù)弥藀rintf()函數(shù)的返回值是打印字符的個數(shù)后,可以做出一下分析。

三、函數(shù)遞歸
遞歸的優(yōu)缺點
程序調(diào)用自身的編程技巧稱為遞歸??梢灾苯踊蜷g接的調(diào)用,本質(zhì)是把復(fù)雜的問題轉(zhuǎn)化為一個規(guī)模小的問題。遞歸一般只需少量的代碼就可描繪出多次重復(fù)計算。遞歸的主要思考方式:大事化小
必要條件
- 存在限制條件,當滿足這個限制條件的時候,遞歸便不再繼續(xù)。
- 每次遞歸調(diào)用之后越來越接近這個限制條
使用場景
1. 能夠要求轉(zhuǎn)化為新的問題,且二者解決方法相同,所處理的對象存在規(guī)律變化。
2. 非遞歸比較麻煩,而遞歸很簡單。
3. 有模板或是公式可以直接套用,不會出現(xiàn)明顯問題。
函數(shù)遞歸的細節(jié)說明
1. 每級遞歸都有自己的變量,可能名稱相同,但是值不同。
遞歸調(diào)用時,系統(tǒng)自動保留當前函數(shù)的參數(shù)變量。
每次調(diào)用系統(tǒng)都會為函數(shù)開辟相應(yīng)的空間。
2. 每次調(diào)用都要返回值,遞歸執(zhí)行結(jié)束后,控制權(quán)傳回到上一級函數(shù)。
調(diào)用結(jié)束后,系統(tǒng)釋放本次調(diào)用所開辟的空間,
程序返回到上一次的調(diào)用點,同時獲得初進該級調(diào)用的參數(shù)。
每級遞歸必須逐級返回,不可跳躍或間斷。
3. 函數(shù)中遞歸語句之前的代碼,按被調(diào)函數(shù)的順序執(zhí)行,
遞歸之后的代碼,與被調(diào)函數(shù)相反的順序執(zhí)行。
舉例說明
接受一個整型值(無符號),按照順序打印它的每一位。例如,輸入:1234,輸出:1 2 3 4
代碼示例:
#include<stdio.h>
void print(unsigned int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
unsigned int num = 0;
scanf("%u", &num);
//print函數(shù)可以打印參數(shù)部分數(shù)字的每一位
print(num);
//函數(shù)遞歸 - 自己調(diào)用自己
return 0;
}輸出結(jié)果:

代碼分析:

對兩個必要條件的理解
存在限制條件,當滿足這個限制條件的時候,遞歸便不再繼續(xù)。

每次遞歸調(diào)用之后越來越接近這個限制條件。

如果是遞歸,兩個限制條件必定滿足。
四、遞歸練習(xí)
編寫函數(shù)不允許創(chuàng)建臨時變量,求字符串的長度:
題目要求不允許創(chuàng)建臨時變量,當前代碼不符合要求。
#include<stdio.h>
#include<string.h>
int my_strlen(char* str)
{
int count = 0; // 臨時變量
//printf("%c\n", *s);
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
//求字符串的長度
char arr[] = "haha";
int len = strlen(arr);
printf("%d\n", len);
return 0;
}符合要求的寫法:
#include<stdio.h>
#include<string.h>
int my_strlen(char* str)
{
if (*str == '\0')
{
return 0;
}
else
{
return 1 + my_strlen(str + 1);
}
}
int main()
{
//求字符串的長度
char arr[] = "haha";
//arr是數(shù)組名,數(shù)組名是數(shù)組首元素的地址
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}代碼分析:

運行結(jié)果:

到此這篇關(guān)于C語言超全面講解函數(shù)的使用方法下的文章就介紹到這了,更多相關(guān)C語言函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)LeetCode(80.有序數(shù)組中去除重復(fù)項之二)
這篇文章主要介紹了C++實現(xiàn)LeetCode(80.有序數(shù)組中去除重復(fù)項之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07

