跳至內容

C語言

出自Taiwan Tongues 台語維基
這是此頁批准,以及是最近的修訂。

C是一種通用的、程序是編程程式語言,支援結構化編程、詞法作用域佮遞迴,使用靜態型別系統,而且廣泛用佇系統軟體佮應用軟體的開發。

C 語言佇一九六九年至一九七三年間,為著移植佮開發 UNIX 作業系統,是由丹尼斯 ・ 里奇佮肯 ・ 湯普遴,以 B 語言為基礎,佇貝爾實驗室設計、開發出來。二十世紀八十年代,C 語言應用日漸漸廣泛。為著避免各開發廠商用的 C 語言的語法產生差異,美國國家標準局為 C 語言定著一套完整的國際標準語法,這號做 ANSI C,做為 C 語言的標準。佮這个同時,國際標準化組織嘛接受這个標準為國際標準。所以,ANSI C 嘛仝時陣予人叫做是 ISO C。二十世紀八十年代到今的有關程式開發工具,一般攏支援符合 ANSI C 的語法。

C 語言具有高效、靈活、功能豐富、表達力強佮較懸的會當移植性等等的特點,有內底的設計當中攏真佮意,成做最近二五冬使用上廣泛的程式語言。目前,C 語言編譯器普遍存在佇咧各種無仝的作業系統內底,比如講 Microsoft Windows、macOS、Linux、Unix 等。C 語言的設計影響了濟濟了後來的程式語言,比如講 C + +、Objective-C、Java、C # 等。現行的濟濟的軟體攏是由 C 語言抑是其實影響佮衍生的程式語言開發出來的。

概述

佮 ALGOL 一族的程序大多數的程序,C 語言是一个有結構化程式設計、有變數作用域(variable scope)猶閣有遞迴功能的程序語言。其採用的靜態型別系統會當防止無意的程式設計操作。C 語言中所有的通執行代碼攏去予人包含著佇子程式(函式)里。其傳遞參數攏是以值傳遞(pass by value), 另外嘛會當傳遞的指標(a pointer passed by value)。 C 語言是自由形式語言,即其原始碼的縮排並無影響程式的功能,是用分號做語句的結尾,花括號來表示代碼箍。

因為 C 語言的規模較細,若是干焦高層的機制需要使用定義的函式來提供。比如講,C 語言並無直接處理複合物件(譬如講字捾、集合矣、列表、陣列等等)的操作,嘛無對記持體分配工具佮記憶體回收工具的直接定義,嘛本身有輸入佮輸出佮檔案存取的方法。毋過,使用者定義的函式佮 C 語言標準庫中的函式為遮的高層的機制提供可能性。

C 語言嘛有以下的特性:

  • 基本資料類型包括字元、規型佮浮點數等等。另外嘛有衍生的各種資料類型,如指標、陣列、結構佮聯合。
  • 部份的變數類型會當轉換,比如講整數型佮字元型變數。
  • 透過指標(pointer), C 語言會當足簡單對記持體進行低階控制。
  • 無仝的變數類型會當用結構體(struct)組合做伙。
  • 有基本的控制流:語句組、條件判斷、較濟路選擇、迴圈仔等。
  • 函式會當提轉去各種資料類型的值,並且攏會使遞迴呼叫。逐擺呼叫函式會重新建立變數。
  • C 語言干焦三十二个保留字(reserved keywords), 使變數、函式號名閣較濟伸勼。
  • 編譯預處理(preprocessor)予 C 語言的編譯閣較有伸勼。

歷史

二十世紀七空年代,肯 ・ 湯姆森為著設計的 Unix 系統閣較懸效,使用 B 語言的變種(即 C 語言)佇咧 DEC PDP 鋪七電腦重寫 Unix。C 語言內底真濟重要概念來源於 BCPL 語言,其實乎 C 語言的影響嘛間接地來源於 B 語言。佇一九七八年,丹尼斯 ・ 里奇佮布萊恩 ・ 柯林漢合作出版矣《C 程式設計語言》頭版,事實上就為 K & R C 標準。一九八三年,為著制定一个獨立於具體機器而且無歧義的 C 語言標準,美國國家標準協會成立了一个委員會,並且佇一九八八年完成矣該標準的制定,即 ANSI C。此標準同時予國際標準化組織所採納,嘛予人號做 ISO C。

其後,C 語言到今經過幾擺標準更新,誕生矣 C 九十九、C 十一佮目前上新的標準 C 十八。C 語言標準的後一擺更新 C 二 x 目前當咧起草中。

語法

C 語言的形式文法由國際標準化組織所制定。C 語言的原始碼包含聲明佮函式定義。函式定義閣包含聲明和語句。聲明會當定義一个新的類型,比如講結構(` struct `)、 聯合(` union `)佮列舉(` enum `), 也會當為變數予類型佮預留記憶體。複合語句由一對花括號包含,會當予幾个語句對文法上變做一个語句。

做為一種指令式的編程語言,C 語言使用語句執行操作。上捷看的語句是運算式語句,由一个運算式了加一个分號組成,會當令系統呼叫函式和做變數部分值。C 語言嘛提供各種用保留關鍵字組成的控制流語句,以達到結構化編程的效果,譬如講選擇語句(` if ` 和 ` else `)、 迴箍語句(` for ` 迴箍、` while ` 迴圈佮 ` do ` . . . ` while ` 迴箍)佮跳轉語句(` goto `、` break ` 和 ` continue `)。 運算式會使包含無仝款的運算子,嘛會當呼叫函式。

Hello World 程式

這陣廣泛被編程初學者使用的 " hello , world " 程式實例上頭仔就是出現佇咧《C 程式設計語言》頭一版內底。下跤是一个佇標準輸出裝置(stdout)上列印出 " Hello , world ! " 字串的簡單程式。類似的程式,通常做為初學程式語言的時陣的頭一个程式:

其中干焦 int,void,return 為 C 語言的關鍵字,前置處理器會將 ` # include < stdio . h > ` 替換做 stdio . h 檔案的內容。

main 函式是 C 語言程式的入口點。

` " Hello , world ! \ n " ` 中的 ` \ n ` 是一个跳脫字元,形式做 ` \ ` 加上一字元。所起的作用佇 ASCII 碼中規定。

printf 是聲明於 stdio . h 的函式,關於著 printf 愈濟鋩鋩角角,參見 printf;

關于格式化字串的閣較濟資訊,參見格式化字串。

記持體管理

C 語言的特色之一是:程式設計師著愛親身處理記持體的分配細節。語言無負責記持體邊界檢查,這是因為咧執行的時進行記持體邊界檢查會造成效能的問題,佮 UNIX 哲學無符。特性容易致使緩衝區溢位問題。毋過,部份編譯器(如英特爾編譯器)會佇安全性的考量,提供方法以進行執行的時記持體邊界檢查。

大多數啦 C 語言實現使用棧(Stack)來儲存函式倒轉去位址/疊框基址、完成函式的參數傳遞佮函式局部變數的儲存。毋過,佇咧部份真特殊的平台頂,使用棧並袂當得著上大效率。這當陣的實現由編譯器決定。 若程式需要咧執行的過程中動態分配記憶體,會當利用堆(Heap)來實現。

基本上 C 程式的元素儲存佇咧記持體的時有三種分配策略:

  • 靜態分配若一个變數聲明為全域變數抑是函式的靜態變數,這个變數的儲存會用靜態分配方式。靜態分配的記憶體一般會予人編譯器囥佇資料段或者是代碼段來儉,具體攏著愛看實現。按呢做的前提是,佇咧編譯的時著愛確定變數的大細。

以 IA 三十二的 x 八十六平台佮 gcc 編譯器為例,全域佮靜態變數囥佇資料段的低階;全域佮靜態常數囥佇咧代碼段的高端。

  • 自動分配函式的自動局部變數應該愛綴著函式的返回會自動釋放(失效), 這个要求佇咧一般的體系中間攏是用棧(Stack)來滿足的。佮靜態分配相比,這个時陣,就毋免絕對要求這个變數佇咧編譯的時著愛確定變數的大細,執行的時才決定嘛袂慢,猶毋過 C 八十九猶原要求佇咧編譯的時就愛確定,而且 C 九十九放輕鬆矣這个限制。但是無論是 C 八十九抑是 C 九十九,攏無允准一个已經分配的自動變數執行時改變大細。

所以講C 函式永遠無應該倒轉一个局部變數的位址

欲指出的是,自動分配嘛屬於動態分配,甚至會當用啦 alloca 函式來像分配堆(Heap)仝款來進行分配,而且釋放是自動的。

  • 動態分配猶閣有一種閣較特殊的情況,變數的大細咧執行的時有可能改變,或者是講雖然單一个變數大細無變,變數的數目煞有真大的伸勼,袂當靜態分配抑是自動分配,這个時陣會用得用堆的(Heap)來滿足要求。ANSI C 定義的堆操作函式是 malloc、calloc、realloc 和 free。

用堆的(Heap)記持體會帶來其他的開銷佮風險。

C 語言的標準文件要求了一个平台徙栽 C 語言的時陣上無愛實現的一寡功能佮封裝的集合,這號做「標準庫」,標準庫的聲明頭殼通過前置處理器命令 # include 來進行參照。

佇咧 C 八十九標準中:

佇九四年的修正版內底

  • < iso 六百四十六 . h >
  • < wchar . h >
  • < wctype . h >

佇咧 C 九十九中增加六个函式庫

  • < complex . h >
  • < fenv . h >
  • < inttypes . h >
  • < stdbool . h >
  • < stdint . h >
  • < tgmath . h >

以上是 C 語言的標準。各種的系統各種的閣對 C 庫函式進行的各種擴充,就浩如煙海矣。如 POSIX C、GNU C 等。

工具軟體

工具軟體會當幫助程式設計者避免有一寡程式中藏抑是容易出現的問題,親像定定會造成程式無預期動作或者是執行期錯誤的程式碼。

語言攏有自動原始碼檢查佮審計工具,C 語言嘛有類似工具,像講 Lint。會當佇程式拄仔好咧寫 Lint 揣出可能有問題的程式,通過 Lint 才閣用 C 編譯器進行編譯,足濟編譯器嘛會當設定講敢是欲針對一寡可能有問題的程式碼提出警告。MISRA C 是一套針對入式的系統的法則,可能嘛是避免一寡可能有問題的路碼。

嘛有一寡編譯器、程式庫或者是作業系統會當處理一寡非標準 C 語言的功能,譬如講邊界值檢查、衝區溢位偵測、序列化佮自動糞埽回收功能。

使用像 Valgrind 抑是 IBM Rational Purify 等等軟體的工具,抑是講連結有特別 malloc 函式的程式庫,對揣出一寡運行期來做記持體使用的問題。

經典錯誤

「 void main ( )」的用法並毋是任何標準制定的。C 語言標準語法是「int main ( )」,任何實現攏愛支援 ` int main ( void ) { / * . . . * / } ` 和 ` int main ( int argc , char * argv [] ) { / * . . . * / } `。佇咧 C + + 標準中,main 的標準型態應該是 int,無類型是由實現定義的。任何實現攏愛支援 ` int main ( ) { / * . . . * / } ` 和 ` int main ( int argc , char * argv [] ) { / * . . . * / } `。

參見

  • 塊 ( C 語言擴充 )

註跤

註解

參考資料

參考資料

外部連結

  • Coding Programmer Page / C Library Reference and Examples ( english )
  • GCC 頭頁
  • GLIBC 兩條頁
  • Visual Studio Express 頭頁
  • ISO / IEC 九千八百九十九。C 九十九標準的官方網站。目前(二空二空年)會當直接幫下載的標準文字是 ISO / IEC 九千八百九十九 : 兩百空二 x。