編寫一個簡單的C語言程序(編寫一個簡單的c語言程序,使得在屏幕上顯示)
作為一名以Java為主的開發(fā)人員,深感不理解操作系統(tǒng)底層原理的痛苦,為了能更好掌握操作系統(tǒng)的相關(guān)知識點,因此我發(fā)自內(nèi)心決定結(jié)合實踐重學(xué)C語言這門編程語言。
重學(xué)C語言的第一個步驟,我決定從這個pun.c簡單的例子入手,具體代碼如下:
#include <stdio.h>int main(void) { printf("To C,or not to C: that is a question.n"); return 0;}
當(dāng)你讀到我的文章且看到這個例子的時候,我不想讓你心里抱著以為這個例子簡單的心態(tài)而使你錯過重要的信息以及對忽視這個例子背后所蘊藏的魅力。接下來讓我來詳細(xì)分析這個例子,讓你更深入理解它。
一、代碼解析:
1 #include<stdio.h> 表示C語言標(biāo)準(zhǔn)輸入輸出相關(guān)信息
2 main方法前面的int 表示main方法執(zhí)行完成后返回的值的數(shù)據(jù)類型為int
3 main方法中void 表示形式參數(shù)類型無,用void關(guān)鍵字來表示
4 這個main方法代表的是主程序,也是C語言執(zhí)行的入口
5 main方法內(nèi)部信息表示的是可執(zhí)行的代碼內(nèi)容
6 main方法中第一行是調(diào)用printf函數(shù)將目標(biāo)信息打印出來,n表示目標(biāo)信息輸出后進行換行
7 printf函數(shù)來自標(biāo)準(zhǔn)輸入輸出庫{<stdio.h>}中
8 第二行代碼表示執(zhí)行結(jié)束后向操作系統(tǒng)返回值為0
二、程序編譯和鏈接
假設(shè)我們在Visual Studio編輯器上編寫完成程序后,運行只需要按住快捷鍵Ctrl F5就會在顯示控制臺中打印printf函數(shù)中的內(nèi)容。雖然這么簡單的動作,但是卻還要經(jīng)歷很多看不見的步驟才能看見對應(yīng)的結(jié)果。那具體是什么步驟呢?我來詳細(xì)分析一下:
1 生成一個含有上述程序代碼名為pun.c的文件
2 把程序轉(zhuǎn)換為機器可以執(zhí)行的形式
2.1 預(yù)處理
(1)把程序移交給預(yù)處理器【preprocessor】進行處理
(2)預(yù)處理器執(zhí)行以#開頭的命令,預(yù)處理器可以對程序進行修改或新增一些內(nèi)容
2.2 編譯
(1)被預(yù)處理器修改后的程序被放到編譯器【compiler】
(2)編譯器會將程序編譯成機器代碼
2.3 鏈接
(1)鏈接器【linker】將由編譯器生成的機器代碼和其它附加代碼整合在一起,產(chǎn)生最終可以執(zhí)行的程序
(2)附加代碼主要是程序中使用到庫函數(shù),如上述代碼例子用到printf函數(shù)
3 語句
語句是程序運行時執(zhí)行的命令。在pun.c文件中,用到了兩種語句,分別是函數(shù)調(diào)用語句和返回語句。此外C語言要求在每個語句的末尾必須以分號結(jié)束
編譯和鏈接這幾個步驟往往是自動實現(xiàn)的,實際上,預(yù)處理器一般是和編譯器集成在一起,導(dǎo)致我們無法肉眼看到它們在工作。在實際的開發(fā)過程中,根據(jù)編譯器和操作系統(tǒng)的不同,編譯和鏈接所需要的命令也許是多種多樣的。在UNIX或Linux操作系統(tǒng)中自帶有cc編輯器,因此我們可以使用cc編譯器對pun.c程序進行編譯和鏈接。具體的操作如:
cc pun.c
在終端或者命令行窗口中執(zhí)行cc pun.ch后,在當(dāng)前的目錄下,我們可以看到生成a.out文件,這個文件就是操作系統(tǒng)自動進行鏈接操作而生成的默認(rèn)文件。cc編譯器有許多的選項,其中一個就是-o,-o表明將cc編譯器會將預(yù)編譯和鏈接的時候可以指定生成文件的名稱
對gcc編譯器,也可以將pun.c進行預(yù)編譯和鏈接,生成對應(yīng).out文件,操作命令如下:
gcc pun.c
gcc編譯器也可以通過參數(shù)-o生成指定的文件
gcc -o pun.h pun.c
到此為止,通過對一個簡單的C語言程序的分析,讓我們了解到C語言代碼的簡單布局和組成部分所代表的含義。此外還明白了從編寫程序到執(zhí)行輸出目標(biāo)信息所經(jīng)歷的步驟。
請關(guān)注我,讓我們共同進步罷!