第一章 初始C語言
1. C語言起源
1969年至1973年間,為了移植與開發UNIX操作系統,由丹尼斯·里奇與肯·湯普遜,以B語言為基礎,在貝爾實驗室設計、開發出來。
C語言具有高效、靈活、功能豐富、表達力強和較高的可移植性等特點,在程序設計中備受青睞,成為使用最為廣泛的編程語言。目前,C語言編譯器普遍存在於各種不同的操作系統中,例如Microsoft Windows、macOS、Linux、Unix等。C語言的設計影響了眾多后來的編程語言,例如C++、Objective-C、Java、C#等。
二十世紀八十年代,為了避免各開發廠商用的C語言的語法產生差異,由美國國家標准局為C語言訂定了一套完整的國際標准語法,稱為ANSI C,作為C語言的標准。二十世紀八十年代至今的有關程序開發工具,一般都支持符合ANSI C的語法。
2. 選擇C語言的理由
2.1 設計特性
C語言的設計理念讓用戶能輕松完成自頂向下的規划、結構化編程和模塊化設計。因此,用C語言編寫的程序更易懂、更可靠。
2.2 高效性
C語言具有通常是匯編語言才具有的微調控制能力,可以根據具體情況微調程序以獲得最大運行速度或最有效地使用內存。
2.3 可移植性
C語言是移植語言。在一種系統中編寫的C程序稍作修改或不修改就能在其他系統運行。
2.4 強大而靈活
C語言功能強大且靈活,如UNIX操作系統是用C語言寫的。其他的一些語言(FORTRAN、perl、Python、Pascal、BASIC)的編譯器和解釋器都是C語言編寫。
2.5 面向程序員
C語言是為了滿足程序員的需求而設計的,程序員利用C可以訪問硬件、操作內在中的位。C語言有豐富的運算符,能讓程序員簡潔表達自己的意圖。
3. C語言的應用范圍
早在20世紀80年代,C語言就有已經成為小型計算機使用的主流語言。從那以后C語言的應用范圍擴展到微型機和大型機。C語言是嵌入式系統編程的流行語言,還能從科學編程領域分一杯羹,而且作為開發操作系統的主流語言C在Linux開發中扮演着極其重要的角色。
4.計算機能做什么
中央處理單元(CPU)承擔絕大部分的運算工作。隨機存取內存(RAM)是存儲程序和文件的工作區。而永久內存存儲設備(硬盤:機械硬盤和固態硬盤)在關閉計算機后也不會丟失之前存儲的程序和文件。還有各種外圍設備(鍵盤、鼠標、觸摸屏、顯示器)提供人與計算機之間的交互。
5. C語言標准
C語言發展之初,並沒有所謂的C標准。1978年布萊恩·柯林漢和丹尼斯·里奇合著的
5.1 第1個ANSI/ISO C標准
1983年美國國家標准協會(ANSI)組建了一個委員會(X3J11),開發了一套新標准,並於1989年正式公布。該標准(ANSI C)定義了C語言和C標准庫。國際標准化組織於1990年采用了這套標准(ISO C).ISO C 和 ANSI C是完全相同的標准。ANSI/ISO 標准的最終版本通常叫C89.
C精神:
- 信任程序員;
- 不要妨礙程序員做需要做的事;
- 保持語言精練簡單;
- 只提供一種方法執行一項操作;
- 讓程序運行更快,即使不能保證其可移植性。
在1990年,ANSI C標准(帶有一些小改動)被國際標准化組織采納為ISO/IEC 9899:1990,這個版本有時候稱為C90。因此,C89和C90通常指同一種語言。
5.2 C99標准
1994年 ANSI/ISO聯合委員會(C9X委員會)開始修訂C標准,最終發布了C99標准。委員會的用意不是在C語言中添加新特性,而是為了達到新的目標
- 第一個目標是支持國際化編程
- 第二個目標是調整現有實踐致力於解決明顯的缺陷
- 第三個目標是為適應科學和工程項目中的關鍵數值計算,提高C的適應性。
5.3 C11標准
標准委員會在2007年承諾C標准的下一個版本是C1X,2011年終於發布了C11標准。此次委員會提出了一些新的指導原則,不在那么強調"信任程序員"目標了。而且C99中的一些特性成為C11的可選項了。
5.4 C18 標准
C18 (也被稱為為C17)是於2018年6月發布的ISO/IEC 9899:2018的非正式名稱, 也是截止到2020年6月為止最新的C語言編程標准。 它被用來替代C11標准(即ISO/IEC 9899:2011),C18沒有引入新的語言特性,只對C11進行了補充和修正。它是C語言的現行標准。
C18標准即將被C2x標准所取代,C2x引入了一些新特性。目前可以確定的是,C2x標准將加入符合IEEE標准的十進制浮點數,這使得計算機能夠精確地儲存浮點數。
7. 使用C語言的7個步驟
-
定義程序的目標
明確想做什么
-
設計程序
如何組織程序,目標用戶是誰,花多長時間完成這個程序,程序中如何表示數據,怎么處理數據?
-
編寫程序
-
編譯
-
運行程序
-
測試和調試程序
-
維護和修改代碼
8. 編程機制
用C語言編寫程序時,編寫的內容被儲存在文本文件中,該文件被稱為源代碼文件(source code file),大部分C系統,都要求文件名以.c結尾。在文件名中,點號(.)前面的部分稱為基名(basename),點號后面的部分稱為擴展名(extension).
cat concrete.c
#include <stdio.h>
int main(void)
{
printf("Concrete contains gravel and cement.\n");
return 0;
}
8.1 目標代碼文件、可執行文件和庫
把源代碼文件轉換成可執行文件,編譯器把源代碼轉換成中間代碼,鏈接器把中間代碼和其他代碼合並,生成可執行文件。C使用這種分而治之的方法方便對程序進行模塊化,可以獨立編譯單獨的模塊,稍后再用鏈接器合並已經編譯的模塊。
中間代碼文件有多種形式,在這里主要指把源代碼轉換為機器語言代碼,並把結果放在目標代碼文件中。這時目標代碼文件還缺失啟動代碼(startup code)啟動代碼充當着程序和操作系統之間的接口。除啟動代碼外還缺少庫函數,幾乎所有的C程序都要使用C標准庫中的函數,目標代碼文件並不包含該函數的代碼。鏈接器的作用就是把目標代碼、系統的標准啟動代碼和庫代碼這3部分合並成一個文件。即可執行文件。
目標文件和可執行文件都由機器語言指令組成的。目標文件中只包含編譯器為你編寫的代碼翻譯的機器語言代碼,可執行文件中還包含編寫的程序中使用的庫函數和啟動代碼的機器代碼。
8.2 GNU編譯器集合和LLVM項目
GNU項目始於1987年,是一個開發大量免費UNIX軟件的集合。GNU編譯器也被稱為GCC,是該項目的產品之一。
LLVM始於伊利諾伊大學的2000份研究項目。它的Clang編譯器處理C代碼。2021年Clang成為FreeBSD的默認C編譯器。
查看GCC版本:
gcc -v
編譯時使用不同的C標准
gcc -std=c99 inform.c #調用C99標准
gcc -std=c1x inform.c #調用GCC接受C11之前的草案標准
gcc -std=c11 inform.c #調用GCC接受的C11標准