一、代碼分析
? ? ? ?打開項(xiàng)目中的main.c文件(C程序的源文件拓展名為.c),可以發(fā)現(xiàn)它是第一個C程序中的唯一一個源文件,代碼如下:

1.#include <stdio.h>
? ? ? ?? #include 是C語言的預(yù)處理指令之一,所謂預(yù)處理,就是在編譯之前做的處理,預(yù)處理指令一般以 # 開頭
? ? ? ???#include 指令后面會跟著一個文件名,預(yù)處理器發(fā)現(xiàn) #include 指令后,就會根據(jù)文件名去查找文件,并把這個文件的內(nèi)容包含到當(dāng)前文件中。被包含文件中的文本將替換源文件中的 #include 指令,就像你把被包含文件中的全部內(nèi)容拷貝到這個 #include 指令所在的位置一樣
? ? ? ???如果被包含的文件拓展名為.h,我們稱之為"頭文件"(Header File),頭文件可以用來聲明函數(shù)("函數(shù)"就是面向?qū)ο笾械?方法"),要想使用這些函數(shù),就必須先用 #include 指令包含函數(shù)所在的頭文件
? ? ? ???#include?指令不僅僅限于.h頭文件,可以包含任何編譯器能識別的C/C++代碼文件,包括.c,.hpp,.cpp等,甚至.txt,.abc等等都可以
? ? ? ???也就是說你完全可以將第3行到第9行的代碼放到其他文件中,然后用 #include 指令包含進(jìn)來,比如:
1> 將第3行到第9行的代碼放到my.txt中

2> 在main.c源文件中包含my.txt文件

? ? ? ?程序還是可以照常運(yùn)行的,因?yàn)?#include 的功能就是將文件內(nèi)容完全拷貝到 #include 指令所在的位置
? ? ? ?不過你可能會疑惑,為什么stdio.h用尖括號<>,而my.txt用雙引號"" ?這個很好區(qū)別,如果是系統(tǒng)自帶的文件,最好用<>;如果是開發(fā)人員自己創(chuàng)建的文件,最好用""
? ? ? ?說明:這里用txt文件純屬演示,平時做項(xiàng)目不會這樣做,除非吃飽了撐著,才會把代碼都寫到txt中去
2.main函數(shù)
? ? ? ???前面也已經(jīng)提到,C中的函數(shù)就是面向?qū)ο笾械?方法"。C語言是一門面向過程的語言,是以過程為中心的編程思想,就是先分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn),使用的時候一個一個依次調(diào)用函數(shù)就可以了
? ? ? ???一個C程序中一定會有一個main函數(shù),也只能有一個main函數(shù)。main函數(shù)是整個C程序的入口。main.c的第3行代碼就定義了一個main函數(shù)。
? ? ? ???main函數(shù)的返回值為int類型,接收2個參數(shù),其實(shí)可以不寫參數(shù)
main函數(shù)可以簡化成這樣:

? ? ? ?這里要注意的是:這里的main函數(shù)沒有寫返回值類型,并不代表函數(shù)沒有返回值,而是表示返回值類型為int類型,void才代表函數(shù)沒有返回值
? ? ? ?由于C語言的語法限制不嚴(yán)格,我們還可以進(jìn)一步簡化main函數(shù):

? ? ? ?雖然它要求main函數(shù)返回int類型的值,但我們可以不返回
3.stdio.h
? ? ? ???stdio.h 是C語言函數(shù)庫中的一個頭文件,里面定義了一些標(biāo)準(zhǔn)輸入輸出函數(shù)。在main.c的第1行代碼中,用#include指令包含了stdio.h文件。
? ? ? ???這里之所以包含 stdio.h 文件,是因?yàn)樵诘?行中用到了在 stdio.h 內(nèi)部聲明的printf函數(shù),這個函數(shù)可以向標(biāo)準(zhǔn)輸出設(shè)備(比如顯示器屏幕)輸出數(shù)據(jù),屏幕上輸出的文字就是第7行代碼printf("Hello, World!\n");造成的,雙引號""內(nèi)的文本為C語言的字符串
二、開發(fā)和運(yùn)行C程序的步驟
? ? ? ?步驟圖如下:

1.編寫程序
? ? ? ?C語言源文件的擴(kuò)展名為".c",源文件以ASCII碼形式存儲,不能直接被計(jì)算機(jī)執(zhí)行,因?yàn)橛?jì)算機(jī)只能識別二進(jìn)制指令,也就是0和1
2.編譯(VC環(huán)境下)
? ? ? ???把C的源程序翻譯成計(jì)算機(jī)可以識別的二進(jìn)制形式的目標(biāo)代碼文件,這個過程稱為編譯,由C的編譯器完成
? ? ? ???在編譯的同時,還對源程序的語法等進(jìn)行檢查。若出現(xiàn)語法錯誤,則編譯失敗。如果編譯成功則生成目標(biāo)文件,目標(biāo)文件名跟源程序文件名一樣,擴(kuò)展名為".obj"。比如,mj.c編譯后生成目標(biāo)文件mj.obj
? ? ? ???每個源文件是單獨(dú)進(jìn)行編譯的,假如一個項(xiàng)目中有多個.c源文件,編譯成功會生成多個對應(yīng)的.obj目標(biāo)。一般情況下,目標(biāo)文件之間是有關(guān)聯(lián)的,比如 a.obj 可能會調(diào)用 b.obj 中定義的一個函數(shù),因此它們都不能夠單獨(dú)被計(jì)算機(jī)執(zhí)行,而且目標(biāo)文件中并不包含程序運(yùn)行所需要的庫函數(shù)等
3.鏈接(VC環(huán)境下)
? ? ? ???將所有有關(guān)聯(lián)的obj目標(biāo)文件,以及系統(tǒng)提供的C庫函數(shù)等組合在一起生成可執(zhí)行文件的過程,稱為"鏈接"
? ? ? ???鏈接生成的可執(zhí)行文件的文件名跟源程序文件同名,擴(kuò)展名為".exe",計(jì)算機(jī)可以直接執(zhí)行
4.運(yùn)行
? ? ? ?*?在Windows環(huán)境下,直接雙擊".exe"文件即可運(yùn)行C語言程序
? ? ? ?*?雙擊可以用終端(命令行)打開:

三、總結(jié)
? ? ? ?說了這么多,總結(jié)一下第一個C程序的運(yùn)行步驟:

? ? ? ?1.在編譯前先執(zhí)行#include指令,拷貝stdio.h的內(nèi)容到源程序中
? ? ? ?2.編譯源程序,生成目標(biāo)文件
? ? ? ?3.鏈接C語言函數(shù)庫,生成可執(zhí)行文件
? ? ? ?4.運(yùn)行可執(zhí)行文件,在屏幕上輸出"Hello, World!"
? ? ? ?“我是一名從事了10年開發(fā)在退休邊緣垂死掙扎的高齡程序員,最近我花了一些時間整理了一個完整的學(xué)習(xí)C語言、C++的路線,項(xiàng)目源碼和工具。對于想學(xué)習(xí)C/C++的小伙伴而言,學(xué)習(xí)的氛圍和志同道合的伙伴很重要,筆者推薦我專欄的C語言/C++編程愛好者的聚集地>>>C語言/C++進(jìn)階之路 - 專題 - 簡書!
? ? ? ?歡迎初學(xué)和進(jìn)階中的小伙伴。希望你也能憑自己的努力,成為下一個優(yōu)秀的程序員。工作需要、感興趣、為了入行、轉(zhuǎn)行需要學(xué)習(xí)C/C++的伙伴可以一起學(xué)習(xí)!”
? ? ? ?喜歡小編的記得動動您的小指點(diǎn)個關(guān)注喲!
