C語言筆記 by kingwei
1 概述
1.1 發展曆史
C語言是在70年代初問世的。一九七八年由美國電話電報公司(AT&T)貝爾實驗室正式發表了C語言。同時由B.W.Kernighan和D.M.Ritchit合著了著名的“THE C PROGRAMMING LANGUAGE”一書。通常簡稱為《K&R》,也有人稱之為《K&R》標準。但是,在《K&R》中並沒有定義一個完整的標準C語言,後來由美國國家標準局在此基礎上制定了一個C 語言標準,於一九八三年發表。通常稱之為ANSI C。
C語言是一種結構化語言。它層次清晰,便於按模組化方式組織程式,易於調試和維護。由於C語言實現了對硬體的編程操作,因此C語言集進階語言和低級語言的功能於一體,因此也有人稱它為中級語言。此外,C語言還具有效率高,可移植性強等特點。因此廣泛地移植到了各類電腦上,從而形成了多種版本的C語言。
目前最流行的C語言有以下幾種:
·Microsoft C 或稱 MS C
·Borland Turbo C 或稱 Turbo C
·AT&T C
1.2 程式結構舉例
本文檔中列舉的代碼均在Dev-C++中運行通過。
下面這個程式先重新導向標準輸入輸出資料流,然後,從檔案in.txt中讀取資料,調用標準庫函數qsort,升序排序後輸出到檔案out.txt。
#include <stdio.h> /* 包含標頭檔 */
#include <stdlib.h>
#define MAX_LENGTH 100 /* 宏定義 */
int length; /* 定義全域變數 */
int list[MAX_LENGTH];
int Comp(const void *p1, const void *p2) /* 定義函數體 */
{
int e1 = *((int *)p1); /* 定義局部變數 */
int e2 = *((int *)p2);
if (e1 > e2) /* 分支結構(if-else) */
return 1;
else if (e1 < e2)
return -1;
else
return 0; /* 向主調函數傳回值 */
}
int main() /* 主函數 */
{
int i;
freopen("in.txt", "r", stdin); /* 順序結構 */
freopen("out.txt", "w", stdout);
while (scanf("%d", &length) != EOF) /* 迴圈結構(while) */
{
for (i=0; i<length; i++) /* 迴圈(for)控制輸入 */
scanf("%d", &list[i]);
qsort((void *)list, length, sizeof(int), Comp);
for (i=0; i<length; i++) /* 迴圈(for)控制輸出 */
printf("%d ", list[i]);
printf("/n");
}
return 0; /* 進程向系統傳回值 */
}
1.3 編譯、串連
任何一種電腦語言都要從某種人們容易理解的形式(原始碼)轉化成電腦可以執行的形式(機器指令)。對於C語言程式,首先需要對原始碼作預先處理,前置處理器(preprocessor)對先行編譯指令進行處理,產生的程式碼通常存放在一個中間檔案中。然後使用編譯器(compiler),將中間檔案編譯成為目標檔案。最後經過連接器(linker),將目標模組和庫進行串連,並添加啟動模組,才能最終成為系統可以載入和執行的程式。
開發環境 編譯(compile) 串連(link)
(工具) C源檔案 --------------> 目標檔案 ------------>最終檔案
Windows *.c *.obj *.exe 可執行檔
(VC) *.lib 靜態庫檔案
*.dll 動態庫檔案
Linux *.c *.o *.--- 可執行檔
(KDevelop) *.a 靜態庫檔案
*.so 動態庫檔案
因此,將TC、VC等程式設計軟體稱為編譯器是不恰當的,這些軟體是整合了編輯、預先處理、編譯、串連、調試等工具的整合式開發環境。以Dev-C++為例,它提供了一個視窗介面的編輯環境和一些配置選項,但內部編譯器仍然是gcc/g++、內部調試工具是gdb.exe。