編寫程序時必須遵循確切步驟主要是取決於你的計算機環境。因為 C語言是可以移植的,所以它在許多環境中可用,其中包括 UNIX,Linux,Windows等等 。
不過,讓我們首先來看一看許多環境所共有的一些方面。你完全不必知道運行一個 C 程序後面的事情,但了解一點是一個很好的背景知識。它還可以幫助你理解為什麼編寫一個 C 程序必須經過一些特定步驟。
用 C 語言編寫一個程序時,你將編寫的內容保存在一個被稱為原始碼文件的文本文件中。大多數 的系統,都需要該文件的名稱以 .c 結尾。
例如,hello world.c 。名稱中小點前的部分被稱為基本名,小點後的部分被稱為擴展名。因此,hello world是一個基本名,c 是一個擴展名。組合在一起的 hello world.c是文件名。
這樣,在我們提到名稱時內容就可以更具體,我們假定有一個名為 helloworld.c的源文件,其原始碼如下面所示。
------------------------------------------------------
34;hello world! ");
return 0;
}
------------------------------------------------------
C語言編程的基本策略是使用程序將原始碼文件轉換為可執行文件,此文件包含可以運行機器語言代碼。
它分兩步完成這一工作:編譯和連結。編譯器將原始碼轉換為中間代碼,連結器將此中間代碼與其他代碼相結合生成可執行文件。
C 使用被劃分為兩部分的這一方法使程序便於模塊化。你可分別編譯各個模塊,然後使用連結器將編譯過的模塊結合起來。這樣,如果需要改變一個模塊,則不必重新編譯所有其他的模塊。同時,連結器將你的程序與預編譯的庫代碼結合起來。
中間文件的形式有多種選擇。最一般的選擇,同時也是我們這裡講述的實現方式所採取的選擇,是將原始碼轉換為機器語言代碼,將結果放置在一個目標代碼文件中。雖然目標文件包含機器語言代碼,但該文件還不能運行。目標文件包含原始碼的轉換結果,但它還不是一個完整的程序。
目標代碼文件中所缺少的第一個元素是一種叫做啟動代碼(start-up code)的東西,此代碼相當於你的程序和作業系統之間的接口。
例如,你可以在DOS或Linux下運行一個 IBM PC兼容機,在兩種情況中硬體是相同的,所以會使用同樣的目標代碼,但DOS與Linux要使用不同的啟動代碼,因為這兩種系統處理程序的方式是不同的。
所缺少的第二個元素是庫例程的代碼。幾乎所有C程序都利用標準C庫中所包含的例程(稱為函數)。例如,前面的 concrete.c 使用了函數 printf()。目標代碼文件不包含這一函數的代碼,它只包含聲明使用 printf()函數的指令。實際代碼存儲在另一個稱為「庫」的文件中。庫文件中包含許多函數的目標代碼。
連結器的作用是將【目標代碼】、【系統的標準啟動代碼】和【庫代碼】這3個元素結合在一起,並將它們存放在單個文件,即可執行文件中。對庫代碼來說,連結器只從庫中提取你所使用的函數所需要的代碼,如下圖中的簡單示例:
簡而言之,目標文件和可執行文件都是由機器語言指令組成的。但目標文件只包含你所編寫的代碼轉換成的機器語言,而可執行文件還包含你所使用的庫例程以及啟動代碼的機器代碼。
因為 C 編譯器不是標準 Windows 包的一部分,所以需要獲得並安裝一個 C 編譯器。許多廠商都會提供基於 Windows的集成開發環境(IDE) 。
所有編譯器都具有用來裝配C程序的快速,集成的開發環境。關鍵的一點是,它們都具有內置的編輯器,可用來編寫C程序。這類開發環境一般都提供了讓你可以命名和保存原始碼文件的菜單,以及讓你可以不離開IDE就能編譯和運行程序的菜單。
如果編譯器發現任何錯誤,會返回到編輯器中,而且編輯器可以標出有問題的行,並將它們與相應的錯誤消息匹配起來,例如VC6.0、QT、Visual Studio(簡稱vs)。
Windows IDE最初可能讓人有一點望而生畏,因為它們提供多種目標,也就是說,提供了多種可讓程序在其中運行的環境。
例如,它們可能提供16位Windows程序,32位Windows程序,動態連結庫文件(DLL)等等讓你選擇。許多目標都需要引入Windows圖形界面的支持。
為了管理這些選項,通常需要創建一個項目,以便隨後向其中添加將要使用的原始碼文件名。一般來說,首先使用文件菜單來創建一個新的項目。重要的是選取正確的項目形式。本書中的例子是一般性的例子,設計目的是在一個簡單的命令行環境中運行。
因為 Widnows IDE一般可處理 C 和 C++,所以你應該指明你需要一個C程序。在某些產品,可以使用項目類型來指明希望使用 C。而在其他一些產品,如 Microsoft Visual C++中,可以使用.c文件擴展名來指明希望使用 C 而不是 C++。然而,大多數 C 程序也可以作為 C++程序運行。
可能大家在寫完一個程序之後會遇到一個問題:顯示程序執行的窗口在程序終止時突然消失,也就是程序運行後窗口一閃而過。如果遇到這種情況,那麼可以使程序暫停,直到按下 Enter鍵。要做到這一點,請在程序的末尾,恰好在 return 語句之前,添加下面的一行:
getchar();
該行讀取一次按鍵,因此程序將暫停直到按下 Enter 鍵時。有時,根據程序函數的需要,可能已經有一個等待按鍵的指令。在這種情況下,需要使用 getchar()兩次:
getchar();
getchar();
例如,如果程序最後做的事情是請你輸入你的體重,那麼就應當鍵入你的體重並按 Enter 鍵以輸入數據。程序將讀取體重,第1個getchar()將讀取 Enter鍵,第2個getchar()將導致程序暫停,直到再次按下 Enter鍵。如果現在你對此還不太理解,那麼在學習更多關於 C 輸入的知識後你就明白了。
雖然各種IDE都有許多共同的原則,但在細節方面會因產品而異,而在一個產品系列中,又會因版本而異。你必須要經過一些實踐,才能知道編譯器的正確工作方式。
目前,有許多 C 實現方式可用。理想情況下,編寫 C 程序時,假如該程序末使用機器特定的編程技能,則它在任何實現方式中的運行應該是相同的。要在實踐中做到這一點,不同的實現方式需要遵守一個公認的標準。
首先說明一點,C語言並沒有官方的標準。不過,Brian Kernighan 和 Dennis Ritchie 編寫的 The C Programming Language 第1版(1978)成為大家接受的標準,通常稱為 K&R C 或經典 C。
特別是這本書附錄中的「C Reference Manual」已成為 C 實現的指南。例如,編譯器都會聲明它可提供一個完整的 K&R 實現。然而,雖然該附錄定義了 C 語言,但是卻沒有定義 C 庫。
因為 C 比大多數其他語言更加依賴庫,所以還需要一個庫標準。因為缺乏任何官方標準,所以提供 UNIX 實現的庫成為一個事實上的標準。
隨著 C語言的發展和更加廣泛地用於更多種類的系統上,使用 C 的群體意識到它需要一個更加全面,新穎和嚴格的標準。為了滿足這一要求,美國國家標準代組織(ANSI)在1983年設立了一個委員會以發展一個新的標準,該標準於1989年正式採用。
這個新標準(ANSI C)定義了語言和一個標準 C 庫。國標標準化組織於1990年採用一個 C 標準 (ISO C )。ISO C 和 ANSI C 實質上是同一個標準。
ANSI/ISO標準最終版本通常被稱為 C89 (因為 ANSI於1989年批准了該標準) 或 C90(因為 ISO 於1990年批准了該標準)。然而,因為 ANSI版本是首先出現的,所以人們通常使用ANSI C這一術語。
1994年,修訂標準的工作開始了,這一努力的結果是產生了 C99標準。一個聯合 ANSI/ISO委員會籤署了 C90標準的最初原則,包括保持言語短小而簡單。
他們的意圖不是為語言添加新的特性,而是為了滿足新的目標。新目標之一是支持國際化編程,例如,提供了處理國際字符集的方法。第二個目標是「整理現有的慣例以解決明顯的缺點」。
因此,在遇到需要將 C 移植到 64 位處理器時,委員會根據在真實生活中處理問題的人的經驗來添加標準。第三個目標是針對科學和工程項目的重要數字計算改進 C 的適應能力。
國際化,修正其不足和改進計算的實用性這三點是主要的面向改變的目標。形成在關於更改的計劃在性質上更加保守,例如,讓與 C90 和 C++ 的不兼容性達到最小,讓語言在概念上保持簡單。肩帶來說就是希望 C++成為重要的和強有力的語言。
結果是 C99 的修改保持了 C 的本質特性,C 繼續是一種簡短,清楚,高效的語言。本書指出了 C99中的許多修改。因為目前大多數編譯器沒有完全實現所有 C99的修改,所以你可以會發現一些修改在你的系統上不可用。或者你可能會發現,只有修改編譯器的設置以後,才能夠看到一些 C99 的特性。
C 是一種強大,簡潔的程式語言。之所以流行是因為它提供了有用的編程工具和對硬體良好的控制,還因為 C 程序在從一個系統向另一個系統移植方面比大多數程序更容易。C 是一種需要編譯的語言。C 編譯器和連結器是將 C 語言原始碼轉換成可執行代碼的程序。
用 C 編程可能很費力,困難並讓你感到灰心,但這一工作也可能讓你著迷,興奮和感到滿意。
看到這裡是不是又有很多感悟了呢~
如果你很想學會編程,那麼小編推薦我的C語言/C++編程學習基地【私信小編 01 進入】!
都是學編程小夥伴們,帶你入個門還是簡簡單單啦,一起學習,一起加油~
還有許多學習資料和視頻,相信你會喜歡的!
涉及:遊戲開發、常用軟體開發、編程基礎知識、課程設計、黑客等等......