網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
C語(yǔ)言代碼由上到下依次執(zhí)行,原則上函數(shù)定義要出現(xiàn)在函數(shù)調(diào)用之前,否則就會(huì)報(bào)錯(cuò)。但在實(shí)際開(kāi)發(fā)中,經(jīng)常會(huì)在函數(shù)定義之前使用它們,這個(gè)時(shí)候就需要提前聲明。
所謂聲明(Declaration),就是告訴編譯器我要使用這個(gè)函數(shù),你現(xiàn)在沒(méi)有找到它的定義不要緊,請(qǐng)不要報(bào)錯(cuò),稍后我會(huì)把定義補(bǔ)上。
函數(shù)聲明的格式非常簡(jiǎn)單,相當(dāng)于去掉函數(shù)定義中的函數(shù)體,并在最后加上分號(hào);,如下所示:
dataType functionName( dataType1 param1, dataType2 param2 ... );
也可以不寫形參,只寫數(shù)據(jù)類型:
dataType functionName( dataType1, dataType2 ... );
函數(shù)聲明給出了函數(shù)名、返回值類型、參數(shù)列表(重點(diǎn)是參數(shù)類型)等與該函數(shù)有關(guān)的信息,稱為函數(shù)原型(Function Prototype)。函數(shù)原型的作用是告訴編譯器與該函數(shù)有關(guān)的信息,讓編譯器知道函數(shù)的存在,以及存在的形式,即使函數(shù)暫時(shí)沒(méi)有定義,編譯器也知道如何使用它。
有了函數(shù)聲明,函數(shù)定義就可以出現(xiàn)在任何地方了,甚至是其他文件、靜態(tài)鏈接庫(kù)、動(dòng)態(tài)鏈接庫(kù)等。
【實(shí)例1】定義一個(gè)函數(shù) sum(),計(jì)算從 m 加到 n 的和,并將 sum() 的定義放到 main() 后面。
#include<stdio.h>
//函數(shù)聲明
intsum(int m,int n);//也可以寫作int sum(int, int);
intmain(){
int begin =5, end =86;
int result =sum(begin, end);
printf("The sum from %d to %d is %d\n", begin, end, result);
return0;
}
//函數(shù)定義
intsum(int m,int n){
int i, sum=0;
for(i=m; i<=n; i++){
sum+=i;
}
return sum;
}
我們?cè)?main() 函數(shù)中調(diào)用了 sum() 函數(shù),編譯器在它前面雖然沒(méi)有發(fā)現(xiàn)函數(shù)定義,但是發(fā)現(xiàn)了函數(shù)聲明,這樣編譯器就知道函數(shù)怎么使用了,至于函數(shù)體到底是什么,暫時(shí)可以不用操心,后續(xù)再把函數(shù)體補(bǔ)上就行。
【實(shí)例2】定義兩個(gè)函數(shù),計(jì)算1! + 2! + 3! + ... + (n-1)! + n!的和。
#include<stdio.h>
// 函數(shù)聲明部分
longfactorial(int n);//也可以寫作 long factorial(int);
longsum(long n);//也可以寫作 long sum(long);
intmain(){
printf("1!+2!+...+9!+10! = %ld\n",sum(10));
return0;
}
//函數(shù)定義部分
//求階乘
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++){
result +=factorial(i);
}
return result;
}
運(yùn)行結(jié)果:
1!+2!+...+9!+10! = 4037913
初學(xué)者編寫的代碼都比較簡(jiǎn)單,頂多幾百行,完全可以放在一個(gè)源文件中。對(duì)于單個(gè)源文件的程序,通常是將函數(shù)定義放到 main() 的后面,將函數(shù)聲明放到 main() 的前面,這樣就使得代碼結(jié)構(gòu)清晰明了,主次分明。
使用者往往只關(guān)心函數(shù)的功能和函數(shù)的調(diào)用形式,很少關(guān)心函數(shù)的實(shí)現(xiàn)細(xì)節(jié),將函數(shù)定義放在最后,就是盡量屏蔽不重要的信息,凸顯關(guān)鍵的信息。將函數(shù)聲明放到 main() 的前面,在定義函數(shù)時(shí)也不用關(guān)注它們的調(diào)用順序了,哪個(gè)函數(shù)先定義,哪個(gè)函數(shù)后定義,都無(wú)所謂了。
然而在實(shí)際開(kāi)發(fā)中,往往都是幾千行、上萬(wàn)行、百萬(wàn)行的代碼,將這些代碼都放在一個(gè)源文件中簡(jiǎn)直是災(zāi)難,不但檢索麻煩,而且打開(kāi)文件也很慢,所以必須將這些代碼分散到多個(gè)文件中。對(duì)于多個(gè)文件的程序,通常是將函數(shù)定義放到源文件(.c文件)中,將函數(shù)的聲明放到頭文件(.h文件)中,使用函數(shù)時(shí)引入對(duì)應(yīng)的頭文件就可以,編譯器會(huì)在鏈接階段找到函數(shù)體。
原文鏈接:https://blog.csdn.net/Elanie1024/article/details/128769662
相關(guān)推薦
- 2022-05-26 Python?if?else語(yǔ)句對(duì)縮進(jìn)的要求_python
- 2022-08-25 .NET6環(huán)境下實(shí)現(xiàn)MQTT通信及詳細(xì)代碼演示_實(shí)用技巧
- 2022-09-18 C++?STL反向迭代器的實(shí)現(xiàn)_C 語(yǔ)言
- 2022-04-11 socket連接關(guān)閉問(wèn)題分析_python
- 2022-09-17 Redis實(shí)現(xiàn)消息的發(fā)布訂閱原理分析_Redis
- 2022-12-10 深入了解C++11中promise和future的使用_C 語(yǔ)言
- 2023-08-28 vscode里面報(bào):‘xxx‘ is assigned a value but never used
- 2022-08-05 springBoot集成swagger啟動(dòng)報(bào)錯(cuò):Failed to start bean ‘docu
- 最近更新
-
- 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)證過(guò)濾器
- 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)程分支