網(wǎng)站首頁(yè) 編程語言 正文
所謂函數(shù)調(diào)用(Function Call),就是使用已經(jīng)定義好的函數(shù)。函數(shù)調(diào)用的一般形式為:
functionName(param1, param2, param3 ...);
functionName 是函數(shù)名稱,param1, param2, param3 ...是實(shí)參列表。實(shí)參可以是常數(shù)、變量、表達(dá)式等,多個(gè)實(shí)參用逗號(hào),分隔。
在C語言中,函數(shù)調(diào)用的方式有多種,例如:
//函數(shù)作為表達(dá)式中的一項(xiàng)出現(xiàn)在表達(dá)式中
z =max(x, y);
m = n +max(x, y);
//函數(shù)作為一個(gè)單獨(dú)的語句
printf("%d", a);
scanf("%d",&b);
//函數(shù)作為調(diào)用另一個(gè)函數(shù)時(shí)的實(shí)參
printf("%d",max(x, y));
total(max(x, y),min(m, n));
函數(shù)的嵌套調(diào)用
函數(shù)不能嵌套定義,但可以嵌套調(diào)用,也就是在一個(gè)函數(shù)的定義或調(diào)用過程中允許出現(xiàn)對(duì)另外一個(gè)函數(shù)的調(diào)用。
【示例】計(jì)算sum = 1! + 2! + 3! + ... + (n-1)! + n!
分析:可以編寫兩個(gè)函數(shù),一個(gè)用來計(jì)算階乘,一個(gè)用來計(jì)算累加的和。
#include<stdio.h>
//求階乘
longfactorial(int n){
int i;
long result=1;
for(i=1; i<=n; i++){
result *= i;
}
return result;
}
// 求累加的和
longsum(long n){
int i;
long result =0;
for(i=1; i<=n; i++){
//在定義過程中出現(xiàn)嵌套調(diào)用
result +=factorial(i);
}
return result;
}
intmain(){
printf("1!+2!+...+9!+10! = %ld\n",sum(10));//在調(diào)用過程中出現(xiàn)嵌套調(diào)用
return0;
}
運(yùn)行結(jié)果:
1!+2!+...+9!+10! = 4037913
sum() 的定義中出現(xiàn)了對(duì) factorial() 的調(diào)用,printf() 的調(diào)用過程中出現(xiàn)了對(duì) sum() 的調(diào)用,而 printf() 又被 main() 調(diào)用,它們整體調(diào)用關(guān)系為:
main() --> printf() --> sum() --> factorial()
如果一個(gè)函數(shù) A() 在定義或調(diào)用過程中出現(xiàn)了對(duì)另外一個(gè)函數(shù) B() 的調(diào)用,那么我們就稱 A() 為主調(diào)函數(shù)或主函數(shù),稱 B() 為被調(diào)函數(shù)。
當(dāng)主調(diào)函數(shù)遇到被調(diào)函數(shù)時(shí),主調(diào)函數(shù)會(huì)暫停,CPU 轉(zhuǎn)而執(zhí)行被調(diào)函數(shù)的代碼;被調(diào)函數(shù)執(zhí)行完畢后再返回主調(diào)函數(shù),主調(diào)函數(shù)根據(jù)剛才的狀態(tài)繼續(xù)往下執(zhí)行。
一個(gè)C語言程序的執(zhí)行過程可以認(rèn)為是多個(gè)函數(shù)之間的相互調(diào)用過程,它們形成了一個(gè)或簡(jiǎn)單或復(fù)雜的調(diào)用鏈條。這個(gè)鏈條的起點(diǎn)是 main(),終點(diǎn)也是 main()。當(dāng) main() 調(diào)用完了所有的函數(shù),它會(huì)返回一個(gè)值(例如return 0;)來結(jié)束自己的生命,從而結(jié)束整個(gè)程序。
函數(shù)是一個(gè)可以重復(fù)使用的代碼塊,CPU 會(huì)一條一條地挨著執(zhí)行其中的代碼,當(dāng)遇到函數(shù)調(diào)用時(shí),CPU 首先要記錄下當(dāng)前代碼塊中下一條代碼的地址(假設(shè)地址為 0X1000),然后跳轉(zhuǎn)到另外一個(gè)代碼塊,執(zhí)行完畢后再回來繼續(xù)執(zhí)行 0X1000 處的代碼。整個(gè)過程相當(dāng)于 CPU 開了一個(gè)小差,暫時(shí)放下手中的工作去做點(diǎn)別的事情,做完了再繼續(xù)剛才的工作。
從上面的分析可以推斷出,在所有函數(shù)之外進(jìn)行加減乘除運(yùn)算、使用 if...else 語句、調(diào)用一個(gè)函數(shù)等都是沒有意義的,這些代碼位于整個(gè)函數(shù)調(diào)用鏈條之外,永遠(yuǎn)都不會(huì)被執(zhí)行到。C語言也禁止出現(xiàn)這種情況,會(huì)報(bào)語法錯(cuò)誤,請(qǐng)看下面的代碼:
#include<stdio.h>
int a =10, b =20, c;
//錯(cuò)誤:不能出現(xiàn)加減乘除運(yùn)算
c = a + b;
//錯(cuò)誤:不能出現(xiàn)對(duì)其他函數(shù)的調(diào)用
printf("csdn.net");
intmain(){
return0;
}
原文鏈接:https://blog.csdn.net/Elanie1024/article/details/128764881
相關(guān)推薦
- 2022-07-28 Python常用Web框架Django、Flask與Tornado介紹_python
- 2023-07-24 前端常見狀態(tài)碼
- 2022-08-10 Go語言反射獲取類型屬性和方法示例_Golang
- 2022-03-16 C++冒泡排序與選擇排序詳解_C 語言
- 2022-09-26 Python實(shí)現(xiàn)自動(dòng)化域名批量解析分享_python
- 2021-12-18 linux下安裝redis圖文詳細(xì)步驟_Redis
- 2024-02-29 Android系統(tǒng)中g(shù)etCacheDir()、getFilesDir()、getExternalF
- 2022-09-17 python面試題之read、readline和readlines的區(qū)別詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支