C 是一種被廣泛使用的計算機程式設計語言。它是一種通用程式設計語言，支援多重程式設計正規化，例如過程化程式設計、面向物件程式設計、泛型程式設計和函式式程式設計等。 比雅尼斯特勞斯特魯普博士在貝爾實驗室工作期間在 20 世紀 80 年代發明並實現了 C。起初，這種語言被稱作 （包含類的 C 語言），作為 C 語言的增強版出現。隨後，C 不斷增加新特性。虛擬函式、運算子過載、多繼承、標準模板庫、異常處理、執行時型別資訊、名稱空間等概念逐漸納入標準草案。1998 年，國際標準組織頒布了 C 程式設計語言的第一個國際標準 ISOIEC 148821998，目前最新標準為 ISOIEC 148822020。ISOIEC 14882 通稱 ISO C。ISO C 主要包含了核心語言和標準庫的規則。儘管從核心語言到標準庫都有顯著不同，ISO C 直接正式（normative）引用了 ISOIEC 9899（通稱 ISO C），且 ISO C 標準庫的一部分和 ISO C 的標準庫的 API 完全相同，另有很小一部分和 C 標準庫略有差異（例如，strcat 等函式提供對 const 型別的過載）。這使得 C 和 C 的標準庫實現常常被一併提供，在核心語言規則很大一部分相容的情況下，進一步確保使用者通常較容易把符合 ISO C 的源程式不經修改或經極少修改直接作為 C 源程式使用，也是 C 語言繼 C 語言之後流行的一個重要原因。 作為廣泛被使用的工業語言，C 存在多個流行的成熟實現：GCC、基於 LLVM 的 Clang 以及 Visual C 等。這些實現同時也是成熟的 C 語言實現，但對 C 語言的支援程度不一（例如，VC 對 ANSI C89 之後的標準支援較不完善）。大多數流行的實現包含了編譯器和 C 部分標準庫的實現。編譯器直接提供核心語言規則的實現，而庫提供 ISO C 標準庫的實現。這些實現中，庫可能同時包含和 ISO C 標準庫的共用實現（如 VC 的 msvcrt）；而另一些實現的 ISO C 標準庫則是單獨於編譯器專案之外提供的，如 glibc 和 musl。C 標準庫的實現也可能支援多種編譯器，如 GCC 的 libstdc 庫支援 GCC 的 g 和 LLVM Clang 的 clang。這些不同的豐富組合使市面上的 C 環境具有許多細節上的實現差異，因而遵循 ISO C 這樣的權威標準對維持可移植性顯得更加重要。現今討論的 C 語言，除非另行指明，通常均指 ISO C 規則定義的 C 語言（雖然因為實現的差異，可能不一定是最新的正式版本）。 值得注意，和流行的誤解不同，ISO C 和 ISO C 都從未明確要求源程式被編譯（compile），而僅要求翻譯（translate），。技術上，實現 C 和 C 程式的單位是翻譯單元（translation unit）。作為對比，Java 語言規範中就明確要求 Java 程式被編譯實現，明確存在編譯單元（compilation unit）。實際上 C 和 C 也存在 REPL 形式的直譯器實現，如 CINT 和 Cling。但因為傳統上 C 和 C 多以編譯器實現，習慣上仍有一些混用，甚至至今仍出現在 ISO C 某節標準庫條款的標題 上。 傳統上，C 語言被視為和 C 語言實現效能相近的語言，強調執行時的高效。根據《C 編 程思想》一書，C 與 C 的程式碼執行效率往往相差在 5 之間。 發展歷史 C 語言發展大概可以分為三個階段：第一階段從 80 年代到 1995 年。這一階段 C 語言基本上是傳統型別上的面向物件語言，並且憑藉著接近 C 語言的效率，在工業界使用的開發語言中佔據了相當大份額；第二階段從 1995 年到 2000 年，這一階段由於標準模板庫和後來的 Boost 等程式庫的出現，泛型程式設計在 C 中佔據了越來越多的比重。當然，同時由於 Java、C 等語言的出現和硬體價格的大規模下降，C 受到了一定的衝擊；第三階段從 2000 年至今，由於以 Loki、MPL Boost 等程式庫為代表的產生式程式設計和模板超程式設計的出現，C 出現了發展歷史上又一個新的高峰，這些新技術的出現以及和原有技術的融合，使 C 已經成為當今主流程式設計語言中最複雜的一員。 比雅尼史特勞斯特魯普工作起於 1979 年的。這個構思起源於斯特勞斯特魯普做博士論文時的一些程式撰寫經驗。他發現 Simula 具備很利於大型軟體開發的特點，但的執行速度太慢，無法對現實需求發揮功效；BCPL 雖快得多，但它過於低階的特性，使其不適於大型軟體的開發。當斯特勞斯特魯普開始在貝爾實驗室工作時，他有分析 UNIX 核心關於分散式計算的問題。回想起他的博士論文經驗，斯特勞斯特魯普開始為 C 語言增強一些類似的特點。之所以選擇 C，是因為它適於各種用途、快速和可移植性。除了 C 語言和之外，同時也從其它語言中取得靈感，如 ALGOL 68、Ada、CLU 以及 ML。 剛開始時，類別、衍生類別、儲存型別檢查、內聯和預設引數特性，都是透過 Cfront 引入 C 語言之中。 1983 年，改命名為 C（ 是 C 語言中的增值運算子）。加入了新的特性，其中包括虛擬函式、函式名和運運算元多載、參考、常數、使用者可控制的自由空間儲存區控制、改良的型別檢查，並恢復了 BCPL 風格的雙斜線單行註釋（之後 C99 也支援了這種註釋）。 1985 年，釋出第一版《C 程式設計語言》，提供一個重點的語言參考，至此還不是官方標準。1985 年 10 月出現了第一個商業化釋出。 1989 年，釋出了。引入了多重繼承、抽象類別、靜態成員函式、常數成員函式，以及成員保護。1990 年，出版了 The Annotated C Reference Manual。這本書後來成為標準化的基礎。稍後還引入了模板、例外處理、名稱空間、新的強制型別轉換，以及布林型別。 隨著 C 語言的演變，也逐漸演化出相應的標準程式庫。最先加進 C 標準函式庫的是串流程式庫，其用以取代傳統的 C 函式，如 printf 和 scanf。隨後所引入的程式庫中最重要的便是標準模板庫，簡稱 STL。 多年後，一個聯合的 ANSIISO 委員會於 1998 年對 C 標準化（ISOIEC 14882：1998）。在官方釋出 1998 標準的若干年後，委員會處理缺陷報告，並於 2003 年釋出一個 C 標準的修正版本。2005 年，一份名為 Library Technical Report 1（簡稱）的技術報告釋出。雖然還不是官方標準的一部分，不過它所提供的幾個擴充套件可望成為下一版 C 標準的一部分。幾乎所有目前仍在維護的 C 編譯器皆已支援。 目前最新的 C 標準是 2020 年 12 月釋出的 ISOIEC 148822020，又稱 C20。 雖然 C 本身無專利，但標準檔案本身並不是免費的，儘管標準文件不是免費的，但是很容易從網路中取得，最簡單的就是 C 標準文件之前的最後一次草稿版本，它與標準的差別幾乎只在於排版上。 C 名字的由來 C 這個名字是 Rick Mascitti 於 1983 年中所建議的，並於 1983 年 12 月首次使用。更早以前，尚在研究階段的發展中語言曾被稱為「」，之後是「」。在電腦科學中，C 仍被稱為 C 語言的上層結構。它最後得名於 C 語言中的「」運運算元（其對變數的值進行遞增）。而且在共同的命名約定中，使用「」以表示增強的程式。斯特勞斯特魯普說：「這個名字象徵著源自於 C 語言變化的自然演進」。C 是一個和 CC 無關的早期程式語言。 Rick Mascitti 在 1992 年被非正式地問起名字的由來，他表示這是在半開玩笑中說出的。他從沒想過 C 會成為這門語言的正式名字。 有一個關於 C 名字的笑話是，當你使用字尾 時，附加只發生在運算之後（因此，它應該是 C，而不是 C，這個笑話是說時下某些程式設計師還在以使用 C 的方式使用 C，這通常被一些權威著作認為是不正確的）。 C 標準 由進行。已經出版的標準文件如下： 釋出時間 文件 通稱 備註 2023 N4950（草稿，釋出於 20230510） C23 2020 ISOIEC 148822020 C20 2018 ISOIEC TS 215442018 modules TS 模組 2018 ISOIEC TS 195702018 parallelism TS 並行擴充套件 2018 ISOIEC TS 192162018 networking TS 網路庫 2017 ISOIEC 148822017 C17 第五個 C 標準 2017 ISOIEC TS 222772017 coroutines TS 協程庫擴充套件 2017 ISOIEC TS 214252017 ranges TS 提供範圍機制 2017 ISOIEC TS 195682017 library fundamentals TS 標準庫擴充套件 2016 ISOIEC TS 195712016 concurrency TS 用於併發計算的擴充套件 2015 ISOIEC TS 192172015 concepts TS 概念庫，用於最佳化編譯期資訊 2015 ISOIEC TS 198412015 TM TS 事務性記憶體操作 2015 ISOIEC TS 195702015 parallelism TS 用於平行計算的擴充套件 2015 ISOIEC TS 188222015 filesystem TS 檔案系統 2014 ISOIEC 148822014 C14 第四個 C 標準 2011 ISOIEC TR 247332011 十進位制浮點數擴充套件 2011 ISOIEC 148822011 C11 第三個 C 標準 2010 ISOIEC TR 291242010 數學函式擴充套件 2007 ISOIEC TR 197682007 CTR1 C 技術報告：庫擴充套件 2006 ISOIEC TR 180152006 C 效能技術報告 2003 ISOIEC 148822003 C03 第二個 C 標準 1998 ISOIEC 148821998 C98 第一個 C 標準 設計原則 在《C 語言的設計和演化》（1994）中，描述了他在設計 C 時，所使用的一些原則。知道這些原則有助於理解 C 為何會是現在這個樣子。以下總結了一些原則，詳盡的內容可參閱《C 語言的設計和演化》： C 設計成直接的和廣泛的支援多種程式設計風格（過程化程式設計、資料抽象、物件導向程式設計、泛型程式設計）。 C 設計成給程式設計者更多的選擇，即使可能導致程式設計者選擇錯誤。 C 設計成儘可能與 C 相容，藉此提供一個從 C 到 C 的平滑過渡。 C 避免平臺限定或沒有普遍用途的特性。 C 不使用會帶來額外開銷的特性。 C 設計成無需複雜的程式設計環境。 標準程式庫 1998 的 C 標準分為兩個部分：核心語言和 C 標準程式庫；後者包含了大部分標準模板庫和 C 標準程式庫的稍加修改版本。存在許多不屬於標準部分的 C 程式庫，且使用外部連結，程式庫甚至可以用 C 撰寫。 C 標準程式庫充分吸收了 C 標準程式庫，並佐以少許的修改，使其與 C 良好的運作。另一個大型的程式庫部分，是以標準模板庫為基礎，於 1994 年 2 月正式成為 ANSIISO C。它提供了實用的工具，如容器類（如：Array 和），迭代器（廣義指標）提供容器以類似陣列的存取方式，以及泛型演算法進行搜尋和排序的運算。此外還提供了 multi map 和 multi set，它們都共享相似的成員函式。因此，以下成為可能，使用模板撰寫泛型演算法，它可以和任何容器或在任何以迭代器定義的序列上運作。如同 C，使用 include 指令包含標準表頭，即可存取程式庫裡的功能。C 提供 69 個標準表頭，其中 19 個不再贊成使用。 使用標準模板庫（例如：使用 stdvector 或 stdstring 來取代 C 風格的陣列或字元陣列）有助於開發更安全和更靈活的軟體。 在 STL 在納入 C 標準以前，是來自 HP 和後來的 SGI 的第三方程式庫，標準中並未稱之為「」，它只是標準庫中的一部分，但仍有許多人使用這個名稱，以別於其它的標準庫（輸入／輸出串流、國際化、診斷、C 程式庫子集，等等）。 另外，如 stdbasic_string 此類標準委員會新增的介面，有時也被誤認為；實際上它們並不存在於原始的中，在標準化後才從標準庫吸收加入其中。 C 中的特色 和 C 語言相比，C 引入了更多的特性，包括：複合型別（引用型別等）、限定符和常量表達式、型別處理運算子（類型別名及和等多種型別指示符）、C 標準庫（庫與多種容器類）與迭代器、動態記憶體與智慧指標、函式過載、面向物件程式設計（如資料抽象、成員函式、類作用域、建構函式與解構函式、靜態成員、訪問控制與繼承、虛擬函式、抽象類與介面等）、複製控制、運算子過載、造型與函式風格的強制型別轉換、模板與泛型程式設計，以及異常處理、名稱空間、多繼承與虛繼承、執行時型別識別及巢狀類等。 C 在某些案例中（見下「與 C 不相容之處」），進行比 C 還要多的型別檢查。 以「」起始作為註解起源自 C 的前身 BCPL，而後被重新引入到 C。 C 的一些特性，C 不久之後也採用了，包括在迴圈的括號中宣告，C 風格的註解（使用 符號，和 inline，雖然 C99 定義的 inline 關鍵字與 C 的定義不相容。不過，C99 也引入了不存在於 C 的特性，如：可變引數巨集，和以陣列作為引數的較佳處理；某些 C 編譯器可能實作若干特性，以作為擴充套件，但其餘部分並不符合現存的 C 特性） 一個常見的混淆其實只是一個微妙的術語問題：由於它的演化來自 C，在 C 中的術語物件和 C 語言一樣是意味著記憶體區域，而不是 zh 類別；zhtw 類別；zhcn 類 的實體，在其它絕大多數的物件導向語言也是如此。舉例來說，在 C 和 C 中，語句 int i 定義一個 int 型別的物件，這就是變數的值 i 將在指派時，所存入的記憶體區域。 C 語言中的關鍵字 const 是一個 C 和 C 語言的關鍵字，意思是宣告一個不能改變值的變數，即只讀。使用 const 在一定程度上可以提高程式的安全性和可靠性，也便於實現對此進行最佳化（如把只讀物件放入 ROM 中）。const 作為 zh 型別；zhtw 型別；zhcn 型別 限定符，是型別的一部分。 C 不是第一個正式引入 const 型別的語言。80 年代早期，和討論之後提供了在 C 語言中 readonlywriteonly 的實現機制，並在帶類的 C 中取得了一定經驗。關鍵字 const 正式引入 C 語言是在 ANSI C89。這早於第一個 C 國際標準近十年，但此時 const 已被 C 實現普遍採用。 以下是和 C 語言相容的用法： int m 1 n 2 int 型別的物件 const int a 3 const int 型別的物件 int const b 4 同上 const int p 指向 const int 型別物件的指標 int const q 同上 int const x 指向 int 型別物件的 const 指標；注意 const 的位置 const int const r 指向 const int 型別物件的 const 指標 int const const t 同上 但是，const 在 C 中有更強大的特性。它允許在編譯時確定作為真正的常量表達式。例如， const int max_len 42 int a max_len 此前 C 語言並不支援這樣的用法，直到 C99 允許用變數作為陣列長度（需要注意的是 C99 中的支援執行期確定陣列長度，但 C 從未支援）。此外，C 中，名稱空間作用域的物件的名稱隱含內部連結。這意味著直接在標頭檔案裡定義物件被多個原始檔包含時，也不會重定義。 在 C11 及之後的 C 標準中，推薦使用擁有更嚴格語義的 constexpr 限定符來表示一個可以出現在常量表達式中的變數。const 可區分為頂層 const toplevel const 和底層 const lowlevel const。 實際上，在語義表達方面，const 更多表示為 只讀，constexpr 才表示一定能在翻譯時確定的常量，但實際求值仍可能在執行時進行（只有像作為宣告陣列大小這樣確定要求常量表達式的上下文中，才會因為需要確保翻譯時必須確定所需的值而進行翻譯時求值）。C20 引入了更嚴格的 consteval 和 constinit 的語法，直接限定特定的求值必須在翻譯時完成。不過，和 const 不同，後三者修飾宣告但不是型別限定符，不參與型別宣告構成複合型別，不透過型別檢查實現所謂的 const 正確性（const correctness），也不影響利用這些特性的相關 API 的型別簽名。 一些參照 C 和 C 設計的語言中，也存在類似的差異。例如，C 同時具有 readonly 和 const 關鍵字，前者接近原始的 只讀（即最先被討論的 readonly 機制和 C 語言中的 const），而後者更接近 C 的 const。 與 C 不相容之處 C 有時被認為是 C 的超集，但這並不嚴謹。 各個版本的的附錄 C 中都指出了 C 和的一些不相容之處。 大部分的 C 程式碼可以很輕易的在 C 中正確編譯，但仍有少數差異，導致某些有效的 C 程式碼在 C 中失效，或者在 C 中有不同的行為。 最常見的差異之一是，C 允許從 void 隱式轉換到其它的指標型別，但 C 不允許。下列是有效的 C 程式碼： 從 void 隱式轉換為 int int i malloc sizeof int 5 但要使其在 C 和 C 兩者皆能運作，就需要使用顯式轉換： int i int malloc sizeof int 5 另一個常見的可移植問題是，C 定義了很多的新關鍵字，如 new 和 class，它們在 C 程式中，是可以作為識別字（例：變數名）的。 C99 去除了一些不相容之處，也新增了一些 C 的特性，如 註釋，以及在程式碼中混合使用。不過 C99 也納入幾個和 C 衝突的新特性（如：可變長陣列、原生複數型別和複合逐字常數），而 C11 已經加入了相容 C99 預處理器的特性。 由於 C 函式和 C 函式通常具有不同的名字修飾和呼叫約定，所有在 C 中呼叫的 C 函式，須放在 extern C C 函式宣告 之內。 C 的程式 下面這個程式顯示 Hello world 然後結束執行： include iostream C20 前 import iostream C23 前 import std C23 起 int main stdcout Hello world stdendl C23 前 stdprintln Hello world C23 起 return 0 這裡也可以使用指令以避免多次宣告 std include iostream using namespace std int main cout Hello world endl return 0 如果使用 n 代替以上程式碼裡的 ，輸出結果相等。 stdcout Hello worldn stdendl 不僅僅會在某個輸出流中插入換行字元，還將執行輸出流的 flush 函式（即重新整理緩衝區），而 n 則不會。 根據 ISO C 的規定，全域性函式必須返回。 以下兩種形式是合法的： int main int main int argc char argv 不過，在一些編譯器（例如 Visual C）上， void main 也是合法的。但是這樣的寫法相容性較差。 語言特性 運算子 分為 優先權 運運算元 說明 結合性 1 括號 由左至右 2 、、、 邏輯運運算元 NOT、算術運運算元負號、遞增、遞減 由右至左 3 、、 算術運運算元的乘法、除法、餘數 由左至右 4 、 算術運運算元加法、減法 由左至右 5 、、 位元運運算元左移、右移、無符號右移 由左至右 6 、、、 關係運運算元大於、大於等於、小於、小於等於 由左至右 7 、 關係運運算元等於、不等於 由左至右 8 位元運運算元 AND 由左至右 9 位元運運算元 XOR 由左至右 10 位元運運算元 OR 由左至右 11 邏輯運運算元 AND 由左至右 12 邏輯運運算元 OR 由左至右 13 條件控制運運算元 由右至左 14 、op 指定運運算元 由右至左 前處理器 C 主要有三個編譯階段：預處理、轉譯成目的碼和連結（最後的兩個階段一般才視為真正的「編譯」）。在第一階段，預處理，會將前處理器指令替換成原始碼，然後送到下一個編譯階段。 前處理器指令和巨集 預處理指令的運作方式是根據使用者定義的規則，簡單的把記號字元序列置換成其它的記號字元序列。它們進行巨集置換、含入其它的檔案（由底層至高階的特性，例如包含模組／包／單元／元件）、條件式編譯和條件式含入。例如： define PI 31415926535897932384626433832795028841971693993751 原始程式碼中出現的 PI，都將會替換為 31415926535897932384626433832795028841971693993751。另一個普遍的例子是 include iostream 它將使用標準庫標頭檔案 iostream 中的所有內容來替換本條預處理指令。除了以上提到的常用指令以外，還有幾個額外的前處理器指令，可以用來控制編譯流程、條件式含入或排除程式碼區塊等等。 參閱前處理器和 C 前處理器 模板 模板指 C 程式語言中的函式模板與類別模板，這種觀念是取材自 Simula 的泛型程式設計。它採用 typename 和 class 兩個關鍵字，來標識模板類別的型別引數。C11 和 C14 分別引入了類型別名模板和變數模板。 類別與物件 在物件導向物件程式設計術語中，物件是資料和處理資料的指令的聯合。模擬實際世界，物件有三種特質：狀態、行為、，並且使用訊息來引發彼此的互動。類別為物件的藍圖或工廠，定義了物件的抽象特質，包括物件的屬性特質和物件的行為特質，屬性的值即是物件的狀態，行為即是物件能夠做的事。 C 為類別構成式物件導向程式設計語言，類別概念具現化地作為二等公民出現在 C 語言當中，在語法中明確地使用類別來做到資料抽象化、封裝、模組化、繼承、子型別多型、物件狀態的自動初始化。C 中，一個類別即為一個型別，加上封裝，一個類別即為一個抽象資料型別（，），繼承、多型、模板都加強了類別的可抽象性。在 C 可以使用或這兩個關鍵字宣告類別，而使用運運算元實體化類別產生的實體即為物件，是一等公民。CC 以資料成員表達屬性，以成員函式表達行為。 宣告一個： class Car private int isRunning public Run 但是仍然需要注意，嚴格來說，C 中物件的概念和 C 的對應概念接近，表示的是具有特定型別的儲存，而非面向物件意義上的 物件：一個物件不一定是類型別的。此外，C 意義上的 例項 僅指模板例項化的結果，而並不指物件。作為對比，Java 的 物件 和 例項 的概念和這裡的使用一致。 封裝 封裝是將資料和處理資料的程式組合起來，僅對外公開介面，達到資訊隱藏的功能。封裝的優點是能減少耦合。C、、C 等語言定義物件都是在語法中明確地使用類別來做到封裝。 C 的類別對其成員（包括資料成員、函式成員）分為三種封裝狀態： 公有：類別的使用者可以訪問、使用該類別的此種成員。 保護：該類別的衍生類別可以訪問、使用該類別的此成員。外部程式程式碼不可以訪問、使用這種成員。 私有：只有類別自身的成員函式可以訪問、使用該類別的此成員。 一般可以將 C 類的對外介面設定為公有成員；類內部使用的資料、函式設定為私有成員；供派生自該類別的子類別使用的資料、函式設定為保護成員。 繼承 繼承是指派生類繼承基類，會自動取得超類別除私有特質外的全部特質，同一類別的所有實體都會自動有該類別的全部特質，做到程式碼再用。C 只支援類別構成式繼承，雖然同一類別的所有實體都有該類別的全部特質，但是實體能夠共享的實體成員只限成員函式，類別的任何實體資料成員乃每個實體獨立一份，因此物件間並不能共享狀態，除非特質為參考型別的屬性，或使用指標來間接共享。C 支援的繼承關係為： 公有繼承：最常用繼承關係，含義是「」關係，代表了在完全使用公有繼承的物件類別之間的層次關係。 受保護繼承：基礎類別的公有或保護內容可以被衍生類別，以及由此衍生的其他類別使用。但是基礎類別對外界使用者是不可見的。衍生類別的使用者不能訪問基礎類別的成員、不能把派生類別轉換（造型）為基礎類別的指標或引用。 私有繼承：基礎類別的公有或保護內容僅可以被衍生類別訪問。但基礎類別對衍生類別的子類別或衍生類別的使用者都是不可見的。衍生類別的子類別或衍生類別的使用者都不能訪問基礎類別的內容、不能把衍生類別轉換為基礎類別的指標或引用。 C 支援多繼承（，）。多繼承（，）的優缺點一直廣為使用者所爭議，許多語言（如 Java）並不支援多重繼承，而改以單一繼承和介面繼承，而另一些語言則採用用單一繼承和混入。C 透過虛繼承來解決多繼承帶來的一系列問題。 多型 PolymorphismAd Hoc UniversalOverloading Coercion Inclusion Parametric 除了封裝與繼承外，C 還提供了多型功能，物件導向的精神在於多型，一般的多型，是指動態多型，係使用繼承和動態繫結實現，使用多型可建立起繼承體系。類與繼承只是達成多型中的一種手段，所以稱物件導向而非類別導向。 多型又分成靜態多型與動態多型。C 語言支援的動態多型必須結合繼承和動態繫結方式實現。靜態多型是指編譯時決定的多型，包括過載和以模板實現多型的方法即引數化型態，是使用巨集的 程式程式碼膨脹法 達到多型效果。 型別轉換也是一種非引數化多型的概念，C 提供 dynamic_cast static_cast 等運算子來實作強制型別轉換。 運算元過載或函式過載也算是多型的概念。 分析和處理 C 原始程式碼 ，但 C 是個著名的例外：請看下面的程式碼。 include vector include string stdvectorstdvectorstdstring table1 stdvectorstdvectorstdstringtable2 上面的顯然是一個字串的二維陣列，而則未必能透過編譯：如果嚴格遵循分析過程，串 會被解釋為右移運算子而非兩個代表模板引數表結束的右尖括號，因此出現編譯錯誤，必須以的方式用空格區分。在 C11 釋出之後，特別規定了當處理模板時， 被優先視為兩個 ，所以 table1 和 table2 均可透過編譯 爭議 「在這 12 年裡，C 使用者人數大約每七個月半增加一倍」是許多 C 相關檔案必引的一段話；然而，時至今日新語言層出不窮，使用者人數已不太可能以如此速度增長。分析機構定期對開發人員展開調查，其資料顯示，以 C 為工具的開發人員在整個開發界所佔的比例由 1998 年春天的 76 下降至 2004 年秋的 46。 一部分程式設計師對 C 語言深惡痛絕，他們批評的理由如下： STL 以非常醜陋的方式封裝了各種資料結構和演算法，寫出來的程式碼難以理解、不美觀。 C 編譯器複雜和不可靠，不適合構建人命關天類 型的程式。 Ian Joyner 認為面向物件技術徒增學習成本，不如面向過程的 C 語言簡單容易使用，尤其是在系統軟體的構建上 Ian Joyner 著的《C A Critique of C and Programming and Language Trends of the 1990s》第 3 章 51 節。 概括說來 UNIX 程式設計師批評 C 主要是由於社群與 C 社群的文化差異 Eric Raymond 著的《Unix 編 程藝術》一書第十四章第四節 語言評估。 Linux 之父林納斯託瓦茲曾經多次炮轟 C。圖靈獎得主尼克勞斯維爾特也曾經批評 C 語言太複雜、語法語義模糊，是 拙劣工程學 的成果。 事實上，對於 C 語言的批評並不只來源於系統下的程式設計師。就像 C 語言本身是一個跨平臺的語言一樣，對 C 的批評並不侷限於系統使用者。 參閱 《C 程式語言》 比較 Java 和 C C 託管擴充套件 CCLI Boost C Libraries ObjectiveC ，另一個以 C 語言新增物件導向設計的程式語言 參考文獻 延伸閱讀 外部連結 JTC1SC22WG21 The C Standards Committee C 和 C 資源的最終列表 C 教學 CC 參考手冊（中文） CategoryC 語言家族 Category 跨平臺軟體 Category 基於類的程式語言 Category1983 年建立的程式語言