【時時三省】(C語言基礎)對被調用函數的聲明和函數原型

山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省

在一個函數中調用另一個函數(即被調用函數)需要具備如下條件

( 1 )首先被調用的函數必須是已經定義的函數(是庫函數或用戶自己定義的函數),但僅有這一條件還不夠。

( 2 )如果使用庫函數,應該在本文件開頭用# include指令將調用有關庫函數時所需用到的信息“包含”到本文件中來。

例如:

# include < stdio.h >

其中,“stdio.h”是一個“頭文件”。在stdio.h文件中包含了輸入輸出庫函數的聲明。如果不包含“stdio.h”文件,就無法使用輸入輸出庫中的函數。同樣,使用數學庫中的函數,應該用# include < math.h >。h是頭文件所用的后綴,表示是頭文件(headerfile)。

( 3 )如果使用用戶自己定義的函數,而該函數的位置在調用它的函數(即主調函數)的后面(在同一個文件中),應該在主調函數中對被調用的函數作聲明(declaration)。聲明的作用是把函數名、函數參數的個數和參數類型等信息通知編譯系統,以便在遇到函數調用時,編譯系統能正確識別函數并檢查調用是否合法。

例題:

輸入兩個實數,用一個函數求出它們之和。

解題思路:

兩個數相加的算法很簡單。現在用add函數實現它。首先要定義add函數,它為float型,它應有兩個參數,也應為float型。特別要注意的是:要對add函數進行聲明。

編寫程序:

運行結果:?

?

這是一個很簡單的函數調用,函數add的作用是求兩個實數之和,得到的函數值也是實型。程序第3行是對被調用的add函數作聲明:

float add ( float x , float y ) ;

從程序可以看到:main函數的位置在add函數的前面,而程序進行編譯時是從上到下逐行進行的,如果沒有對函數add的聲明,當編譯到程序第7行時,編譯系統無法確定add是不是函數名,也無法判斷實參( a和b )的類型和個數是否正確,因而無法進行正確性的檢查。

如果不作檢查,在運行時才發現實參與形參的類型或個數不一致,出現運行錯誤。但是在運行階段發現錯誤并重新調試程序,是比較麻煩的,工作量也較大。應當在編譯階段盡可能多地發現錯誤,隨之糾正錯誤。

現在,在函數調用之前對add作了函數聲明。因此編譯系統記下了add函數的有關信息,在對“c = add ( a,b );”進行編譯時就“有章可循”了。編譯系統根據add函數的聲明對調用add函數的合法性進行全面的檢查。如果發現函數調用與函數聲明不匹配,就會發出出錯信息,它屬于語法錯誤。用戶根據屏幕顯示的出錯信息很容易發現和糾正錯誤。

可以發現,函數的聲明和函數定義中的第1行(函數首部)基本上是相同的,只差一個分號(函數聲明比函數定義中的首行多一個分號)。因此寫函數聲明時,可以簡單地照寫已定義的函數的首行,再加一個分號,就成了函數的“聲明”。

函數的首行(即函數首部)稱為函數原型( function prototype )。為什么要用函數的首部來作為函數聲明呢?這是為了便于對函數調用的合法性進行檢查。因為在函數的首部包含了檢查調用函數是否合法的基本信息(它包括了函數名、函數值類型、參數個數、參數類型和參數順序),在檢查函數調用時要求函數名、函數類型、參數個數和參數順序必須與函數聲明一致,實參類型必須與函數聲明中的形參類型相同(或賦值兼容,如實型數據可以傳遞給整型形參,按賦值規則進行類型轉換)。否則就按出錯處理。這樣就能保證函數的正確調用。

說明:

使用函數原型作聲明是C的一個重要特點。用函數原型來聲明函數,能減少編寫程序時可能出現的錯誤。由于函數聲明的位置與函數調用語句的位置比較近,因此在寫程序時便于就近參照函數原型來書寫函數調用,不易出錯。實際上,在函數聲明中的形參名可以省寫,而只寫形參的類型,如上面的聲明可以寫為

float add ( float , float );/ /不寫參數名,只寫參數類型

編譯系統只關心和檢查參數個數和參數類型,而不檢查參數名,因為在調用函數時只要求保證實參類型與形參類型一致,而不必考慮形參名是什么。因此在函數聲明中,形參名可寫可不寫,形參名是什么都無所謂,如:

float add ( float a , float b );/ /參數名不用x,y,而用a,b。合法

根據以上的介紹,函數聲明的一般形式有兩種,分別為

( 1 )函數類型函數名(參數類型1參數名1,參數類型2參數名2 ,...,參數類型n參數名n );

( 2 )函數類型函數名(參數類型1,參數類型2,...,參數類型n );

有些專業人員喜歡用不寫參數名的第(2 )種形式,顯得精練。有些人則愿意用第(1 )種形式,只須照抄函數首部就可以了,不易出錯,而且用了有意義的參數名有利于理解程序,如:

void print ( int num , char sex , float score );

大體上可猜出這是一個輸出學號、性別和成績的函數,而若寫成

void print ( int , float , char ) ;

則無從知道形參的含義。

注意:

對函數的“定義”和“聲明”不是同一回事。函數的定義是指對函數功能的確立,包括指定函數名、函數值類型、形參及其類型以及函數體等,它是一個完整的、獨立的函數單位。而函數的聲明的作用則是把函數的名字、函數類型以及形參的類型、個數和順序通知編譯系統,以便在調用該函數時系統按此進行對照檢查(例如,函數名是否正確,實參與形參的類型和個數是否一致),它不包含函數體。

如果已在文件的開頭(在所有函數之前),已對本文件中所調用的函數進行了聲明,則在各函數中不必對其所調用的函數再作聲明。例如:

char letter ( char , char ) ;

float f ( float , float ) ;

int i ( float , float ) ;

int main ( )

{

...

}

/ /下面定義被main函數調用的3個函數

char letter ( char c1 , char c2 )

{

...

}

float f ( float x , float y )

{

...

}

int i ( float j , float k )

{

...

}

由于在文件的開頭(在函數的外部)已對要調用的函數進行了聲明(這些稱為“外部的聲明”),因此在程序編時,編譯系統已從外部聲明中知道了函數的有關信息,所以不必在主調函數中再重復進行聲明。寫在所有函數前面的外部聲明在整個文件范圍中有效。

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82017.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82017.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82017.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微軟宣布的五大重要事項|AI日報0520

微軟宣布的五大重要事項 在 Build 大會上&#xff0c;微軟向大家展示了微軟如何構建開放的智能體網絡。它正在重塑技術棧的每一層&#xff0c;微軟的目標是幫助每一位開發者構建能夠賦能世界各地的人們和組織的應用與智能體。消息來源 詳細了解 以下是微軟宣布的五大重要事項…

三、【數據建模篇】:用 Django Models 構建測試平臺核心數據

【數據建模篇】&#xff1a;用 Django Models 構建測試平臺核心數據 前言我們要設計哪些核心數據&#xff1f;準備工作&#xff1a;創建 Django App開始設計數據模型 (Models)1. 通用基礎模型 (可選但推薦)2. 項目模型 (Project)3. 模塊模型 (Module)4. 測試用例模型 (TestCase…

centos原系統安裝了Python3.7.9兼用在安裝一個python3.8

系統有個3.7.9版本的python 但是會遇到錯誤 usr/local/python3/lib/python3.7/site-packages/urllib3/connectionpool.py:1050: InsecureRequestWarning: Unverified HTTPS request is being made to host ‘www.xxx.com’. Adding certificate verification is strongly advi…

道可云人工智能每日資訊|浙江省人民政府印發《關于支持人工智能創新發展的若干措施》

道可云元宇宙每日簡報&#xff08;2025年5月21日&#xff09;訊&#xff0c;今日元宇宙新鮮事有&#xff1a; 浙江省人民政府印發《關于支持人工智能創新發展的若干措施》 為搶占人工智能發展制高點&#xff0c;打造全球人工智能創新發展高地&#xff0c;浙江省人民政府于近日…

OpenGL ES 基本基本使用、繪制基本2D圖形

OpenGL ES 繪制基礎圖形 OpenGL ES基本概念 OpenGL ES (Embedded-System) 是專為嵌入式設備&#xff08;如手機、平板、VR 設備&#xff09;設計的圖形 API&#xff0c;是 OpenGL 的輕量級版本。 &#xff5c;下面是一個Android使用 OpenGL ES的基本框架 MainActivity 設置一…

JavaScript進階(十二)

第三部分:JavaScript進階 目錄 第三部分:JavaScript進階 十二、深淺拷貝 12.1 淺拷貝 12.2 深拷貝 1. 通過遞歸實現深拷貝 2. js庫lodash里面cloneDeep內部實現了深拷貝 3. 通過JSON.stringify()實現 十三、異常處理 13.1 throw拋異常 13.2 try /catch捕獲異常 1…

大疆制圖跑飛馬D2000的正射與三維模型

1 問題描述 大疆制圖在跑大疆無人機飛的影像的時候&#xff0c;能夠自動識別相機參數并且影像自帶pos信息&#xff0c;但是用飛馬無人機獲取的影像pos信息與影像是分開的&#xff08;飛馬無人機數據處理有講&#xff09;&#xff0c;所以在用大疆制圖時需要對相機參數進行設置…

探索服務網格(Service Mesh):云原生時代的網絡新范式

文章目錄 一、引言二、什么是服務網格基本定義形象比喻 三、服務網格解決了哪些問題微服務通信復雜性可觀察性安全性 四、常見的服務網格實現IstioLinkerdConsul Connect 五、服務網格的應用場景大型微服務架構混合云環境 六、服務網格的未來發展與其他技術的融合標準化和行業規…

Electron+vite+vue3 從0到1搭建項目,開發Win、Mac客戶端

隨著前端技術的發展&#xff0c;出現了所謂的大前端。 大前端則是指基于前端技術延伸出來的各種終端平臺及應用場景&#xff0c;包括APP、桌面端、手表終端、服務端等。 本篇文章主要是和大家一起學習一下使用Electron 如何打包出 Windows 和 Mac 所使用的客戶端APP&#xff…

【DevSecOps】從零到一:用OpenAI Codey與Trivy打造智能化安全掃描 CI/CD 流水線實戰

背景與動機 核心概念&#xff1a;DevSecOps、OpenAI Codey 與 Trivy 什么是 DevSecOpsOpenAI Codey&#xff08;Codex&#xff09;概覽Trivy 掃描器簡介 架構設計與技術選型 流水線實戰&#xff1a;GitHub Actions 集成示例 多平臺適配&#xff1a;GitLab CI 與 Azure DevO…

Swagger、Springfox、Springdoc-openapi 到底是什么關系

記得剛開始想在 SpringBoot 應用中使用 Swagger 生成 API 文檔時&#xff0c;在 Swagger 官網上想找如何在 SpringBoot 中使用的指導&#xff0c;結果肯定是找不到&#xff0c;因為當時不清楚 Swagger 的定位是什么&#xff0c;只知道可以用它生成 API 文檔。所以就想寫這篇文章…

目標檢測DINO-DETR(2023)詳細解讀

文章目錄 對比去噪訓練混合查詢選擇look forward twice 論文全稱為&#xff1a;DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection 提出了三個新的方法&#xff1a; 首先&#xff0c;為了改進一對一的匹配效果&#xff0c;提出了一種對比去噪訓練方法…

深度學習-162-DeepSeek之調用遠程大模型API接口參數結構分析

文章目錄 1 文本對話請求1.1 請求參數1.1.1 參數說明1.1.2 參數總結1.2 返回參數1.2.1 id1.2.2 choices1.2.3 usage1.2.4 created1.2.5 model1.2.6 object1.2.7 參數總結2 應用示例2.1 調用大模型API2.2 返回結果3 參考附錄分析文本對話請求v1/chat/completions的參數結構含義。…

uniapp原生插件

前言 使用uniapp開發Android app時&#xff0c;一些特定的需求沒辦法實現的時候就只能開發原生插件或者uts插件去滿足需求&#xff0c;我的需求目前uts插件沒法實現&#xff0c;只能靠原生插件了&#x1f606; 需求&#xff1a;拍照不保存圖片到相冊&#xff0c;uniapp的API或…

CVE-2024-42323

漏洞名稱 Apache HertzBeat SnakeYaml 反序列化遠程代碼執行漏洞&#xff08;CVE-2024-42323&#xff09; 漏洞描述 Apache HertzBeat 是一款開源的實時監控告警工具&#xff0c;支持對操作系統、中間件、數據庫等多種對象進行監控&#xff0c;并提供 Web 界面進行管理。 在…

“人工智能+多學科”選題思路,2025熱點AI+(180個)

給大家整理了一份超全的論文資料合集 不僅有論文創新點的干貨知識、開題報告模板、文獻綜述模板、審稿意見回復模板、還有全套的SCI論文寫作指導教程和人工智能各方向經典的論文合集以及各大熱門科研和論文寫作潤色工具等 以及1000G人工智能資料包&#xff08;如下圖&#xff…

LangChain4j入門AI(八)使用RAG增加私有知識庫

前言 我們通過提示詞工程提升了通用LLM的專業知識水平&#xff0c;并結合Function Calling構建了私有業務能力。為了在實際應用中有效維護私有領域的專有數據&#xff0c;我們進一步采用大模型微調或RAG檢索增強技術&#xff0c;使LLM能夠充分掌握私有知識庫的內容。 一、微調…

使用arXiv.org上的資源進行學術研究

arXiv.org e-Print archive arXiv.org 是一個收集物理學、數學、計算機科學、定量生物學、定量金融學和統計學等領域學術論文預印本的網站&#xff0c;其使命是促進科學文獻的傳播與交流。以下是關于該網站的詳細介紹&#xff1a; 核心定位與功能 學術預印本平臺&#xff1a…

Redis 中的緩存擊穿、緩存穿透和緩存雪崩是什么?

在 Redis 中&#xff0c;緩存擊穿、緩存穿透和緩存雪崩是常見的緩存問題&#xff0c;它們都會影響系統的性能和穩定性。以下是針對這三個問題的詳細解釋&#xff1a; 一、緩存擊穿&#xff08;Cache Breakdown&#xff09; 定義&#xff1a;緩存擊穿是指某個熱點數據在緩存中…

RabbitMQ配置環境變量

一、RabbitMQ下載 1、從官網下載 在官網中下載&#xff0c;適合自己電腦的版本。我直接下載的windows版本。 然后下載opt這個軟件這個版本適合3.6.3的RabbitMQ&#xff0c;點擊藍色的字體即可下載。 2、安裝erlang 當你雙擊安裝程序并進入安裝向導后&#xff0c;會看到這樣…