分析C語(yǔ)言一個(gè)簡(jiǎn)單程序
首先給大家一個(gè)簡(jiǎn)單的例子,讓讀者有個(gè)整體的認(rèn)識(shí),代碼如下:
#include <stdio.h> int main() { puts("腳本之家"); return 0; }
函數(shù)的概念
先來(lái)看第4行代碼,這行代碼會(huì)在顯示器上輸出“腳本之家”。前面我們已經(jīng)講過(guò),puts 后面要帶( ),字符串也要放在( )中。
在C語(yǔ)言中,有的語(yǔ)句使用時(shí)不能帶括號(hào),有的語(yǔ)句必須帶括號(hào)。帶括號(hào)的稱為函數(shù)(Function) 。
C語(yǔ)言提供了很多功能,例如輸入輸出、獲得日期時(shí)間、文件操作等,我們只需要一句簡(jiǎn)單的代碼就能夠使用。但是這些功能的底層都比較復(fù)雜,通常是軟件和硬件的結(jié)合,還要要考慮很多細(xì)節(jié)和邊界,如果將這些功能都交給程序員去完成,那將極大增加程序員的學(xué)習(xí)成本,降低編程效率。
好在C語(yǔ)言的開發(fā)者們?yōu)槲覀冏隽艘患檬?,他們已?jīng)編寫了大量代碼,將常見的基本功能都完成了,我們可以直接拿來(lái)使用。但是現(xiàn)在問(wèn)題來(lái)了,那么多代碼,如何從中找到自己需要的呢?一股腦將所有代碼都拿來(lái)顯然是非常不明智的。
這些代碼,早已被分門別類地放在了不同的文件中,并且每一段代碼都有唯一的名字。使用代碼時(shí),只要在對(duì)應(yīng)的名字后面加上( )就可以。這樣的一段代碼能夠獨(dú)立地完成某個(gè)功能,一次編寫完成后可以重復(fù)使用,被稱為函數(shù)(Function)。讀者可以認(rèn)為,函數(shù)就是一段可以重復(fù)使用的代碼。
函數(shù)的一個(gè)明顯特征就是使用時(shí)必須帶括號(hào)( ),必要的話,括號(hào)中還可以包含待處理的數(shù)據(jù)。例如puts("腳本之家")就使用了一段具有輸出功能的代碼,這段代碼的名字是 puts,"腳本之家" 是要交給這段代碼處理的數(shù)據(jù)。使用函數(shù)在編程中有專業(yè)的稱呼,叫做函數(shù)調(diào)用(Function Call)。
如果函數(shù)需要處理多個(gè)數(shù)據(jù),那么它們之間使用逗號(hào),分隔,例如:
pow(10, 2);
該函數(shù)用來(lái)求10的2次方。
需要注意的是,C語(yǔ)言中的函數(shù)和數(shù)學(xué)中的函數(shù)不是同一個(gè)概念,不要拿兩者對(duì)比。函數(shù)的英文名稱是 Function,它還有“功能”的意思。大陸將 Function 翻譯為“函數(shù)”,而臺(tái)灣地區(qū)翻譯為“函式”,讀者要注意區(qū)分。
自定義函數(shù)和main函數(shù)
C語(yǔ)言自帶的函數(shù)稱為庫(kù)函數(shù)(Library Function) 。庫(kù)(Library)是編程中的一個(gè)基本概念,可以簡(jiǎn)單地認(rèn)為它是一些列函數(shù)的集合,在磁盤上往往是一個(gè)文件夾。C語(yǔ)言自帶的庫(kù)稱為標(biāo)準(zhǔn)庫(kù)(Standard Library) ,其他公司或個(gè)人開發(fā)的庫(kù)稱為第三方庫(kù)(Third-Party Library) 。
除了庫(kù)函數(shù),我們還可以編寫自己的函數(shù),拓展程序的功能。自己編寫的函數(shù)稱為自定義函數(shù)。自定義函數(shù)和庫(kù)函數(shù)在編寫和使用方式上完全相同,只是由不同的機(jī)構(gòu)來(lái)編寫。
示例中第2~6行代碼就是我們自己編寫的一個(gè)函數(shù)。main 是函數(shù)的名字,( ) 表明這是函數(shù)定義,{ } 之間的代碼是函數(shù)要實(shí)現(xiàn)的功能。
函數(shù)可以接收待處理的數(shù)據(jù),同樣可以將處理結(jié)果告訴我們;使用return可以告知處理結(jié)果。示例中第5行代碼表明,main 函數(shù)的處理結(jié)果是整數(shù) 0。return 可以翻譯為“返回”,所以函數(shù)的處理結(jié)果被稱為返回值(Return Value) 。
第2行代碼中,int 是 integer 的簡(jiǎn)寫,意為“整數(shù)”。它告訴我們,函數(shù)的返回值是整數(shù)。
需要注意的是,示例中的自定義函數(shù)必須命名為 main。C語(yǔ)言規(guī)定,一個(gè)程序必須有且只有一個(gè) main 函數(shù)。main 被稱為主函數(shù),是程序的入口函數(shù),程序運(yùn)行時(shí)從 main 函數(shù)開始,直到 main 函數(shù)結(jié)束(遇到 return 或者執(zhí)行到函數(shù)末尾時(shí),函數(shù)才結(jié)束)。
也就是說(shuō),沒有 main 函數(shù)程序?qū)⒉恢缽哪睦镩_始執(zhí)行,運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。
綜上所述:第2~6行代碼定義了主函數(shù) main,它的返回值是整數(shù) 0,程序?qū)倪@里開始執(zhí)行。main 函數(shù)的返回值在程序運(yùn)行結(jié)束時(shí)由系統(tǒng)接收。
關(guān)于自定義函數(shù)的更多內(nèi)容,我們將在《C語(yǔ)言函數(shù)》一章中詳細(xì)講解,這里不再展開討論。
有的教材中將 main 函數(shù)寫作:
void main() { // Some Code... }
這在 VC6.0 下能夠通過(guò)編譯,但在 C-Free、GCC 中卻會(huì)報(bào)錯(cuò),因?yàn)檫@不是標(biāo)準(zhǔn)的 main 函數(shù)的寫法,大家不要被誤導(dǎo),最好按照示例中的格式來(lái)寫。
頭文件的概念
還有最后一個(gè)問(wèn)題,示例中第1行的#include <stdio.h>是什么意思呢?
C語(yǔ)言開發(fā)者們編寫了很多常用函數(shù),并分門別類的放在了不同的文件,這些文件就稱為頭文件(header file) 。每個(gè)頭文件中都包含了若干個(gè)功能類似的函數(shù),調(diào)用某個(gè)函數(shù)時(shí),要引入對(duì)應(yīng)的頭文件,否則編譯器找不到函數(shù)。
實(shí)際上,頭文件往往只包含函數(shù)的說(shuō)明,也就是告訴我們函數(shù)怎么用,而函數(shù)本身保存在其他文件中,在鏈接時(shí)才會(huì)找到。對(duì)于初學(xué)者,可以暫時(shí)理解為頭文件中包含了若干函數(shù)。
引入頭文件使用#include命令,并將文件名放在< >中,#include 和 < > 之間可以有空格,也可以沒有。
頭文件以.h為后綴,而C語(yǔ)言代碼文件以.c為后綴,它們都是文本文件,沒有本質(zhì)上的區(qū)別,#include 命令的作用也僅僅是將頭文件中的文本復(fù)制到當(dāng)前文件,然后和當(dāng)前文件一起編譯。你可以嘗試將頭文件中的內(nèi)容復(fù)制到當(dāng)前文件,那樣也可以不引入頭文件。
.h中代碼的語(yǔ)法規(guī)則和.c中是一樣的,你也可以#include <xxx.c>,這是完全正確的。不過(guò)實(shí)際開發(fā)中沒有人會(huì)這樣做,這樣看起來(lái)非常不專業(yè),也不規(guī)范。
較早的C語(yǔ)言標(biāo)準(zhǔn)庫(kù)包含了15個(gè)頭文件,stdio.h 和 stdlib.h 是最常用的兩個(gè):
stdio 是 standard input ouput 的縮寫,stdio.h 被稱為“標(biāo)準(zhǔn)輸入輸出文件”,包含的函數(shù)大都和輸入輸出有關(guān),puts() 就是其中之一。
stdlib 是 standard library 的縮寫,stdlib.h 被稱為“標(biāo)準(zhǔn)庫(kù)文件”,包含的函數(shù)比較雜亂,多是一些通用工具型函數(shù),system() 就是其中之一。
最后的總結(jié)
初學(xué)編程,有很多基本概念需要了解,本節(jié)就涉及到很多,建議大家把上面的內(nèi)容多讀幾遍,必將有所收獲。
本節(jié)開頭的示例是一個(gè)C語(yǔ)言程序的基本結(jié)構(gòu),我們不妨整理一下思路,從整體上再分析一遍:
1) 第1行引入頭文件 stdio.h,這是編程中最常用的一個(gè)頭文件。頭文件不是必須要引入的,我們用到了 puts 函數(shù),所以才引入 stdio.h。例如下面的代碼完全正確:
int main() { return 0; }
我們沒有調(diào)用任何函數(shù),所以不必引入頭文件。
2) 第2行開始定義主函數(shù) main。main 是程序的入口函數(shù),一個(gè)C程序必須有 main 函數(shù),而且只能有一個(gè)。
3) 第4行調(diào)用 puts 函數(shù)向顯示器輸出字符串。
4) 第5行是 main 函數(shù)的返回值。程序運(yùn)行正確一般返回 0。
以上就是對(duì) C語(yǔ)言簡(jiǎn)單程序的分析,希望能幫到初學(xué)者。
- C語(yǔ)言判定一棵二叉樹是否為二叉搜索樹的方法分析
- C語(yǔ)言變量類型的深入分析
- C語(yǔ)言 數(shù)組中重復(fù)的數(shù)字分析及方法
- C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中二分查找遞歸非遞歸實(shí)現(xiàn)并分析
- C語(yǔ)言double和float 實(shí)例分析
- C語(yǔ)言求解最長(zhǎng)公共子字符串問(wèn)題及相關(guān)的算法分析
- 簡(jiǎn)單分析C語(yǔ)言中指針數(shù)組與數(shù)組指針的區(qū)別
- C++小知識(shí):不要去做編譯器的工作
- C++小知識(shí):C/C++中不要按值傳遞數(shù)組
- C++小知識(shí):用合適的工具來(lái)分析你的代碼
相關(guān)文章
C++?二叉樹的實(shí)現(xiàn)超詳細(xì)解析
二叉樹可以簡(jiǎn)單理解為對(duì)于一個(gè)節(jié)點(diǎn)來(lái)說(shuō),最多擁有一個(gè)上級(jí)節(jié)點(diǎn),同時(shí)最多具備左右兩個(gè)下級(jí)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。本文將詳細(xì)介紹一下C++中二叉樹的實(shí)現(xiàn)和遍歷,需要的可以參考一下2022-03-03使用C語(yǔ)言實(shí)例描述程序中的內(nèi)聚和耦合問(wèn)題
這篇文章主要介紹了用C語(yǔ)言實(shí)例描述程序中的內(nèi)聚和耦合,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08C++類中隱藏的幾個(gè)默認(rèn)函數(shù)你知道嗎
這篇文章主要為大家詳細(xì)介紹了C++類中隱藏的幾個(gè)默認(rèn)函數(shù),使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03通過(guò)c++的sort函數(shù)實(shí)現(xiàn)成績(jī)排序功能
這篇文章主要介紹了通過(guò)c++的sort函數(shù)實(shí)現(xiàn)成績(jī)排序,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02C++?電話號(hào)碼的字母組合功能實(shí)現(xiàn)
這篇文章主要介紹了C++?電話號(hào)碼的字母組合,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08深入分析C++中兩個(gè)大數(shù)相乘結(jié)果不正確的問(wèn)題
本篇文章是對(duì)C++中兩個(gè)大數(shù)相乘結(jié)果不正確的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05