C++ 程式設計/程式語言/比較/C
C 基本上是 C++ 的核心語言,當 Bjarne Stroustrup 決定建立一個“更好的 C”時。許多語法約定和規則仍然適用,因此我們甚至可以說明 C 是 C++ 的一個子集。大多數最近的 C++ 編譯器也可以編譯 C 程式碼,考慮到微小的不相容性,因為 C99 和 C++ 2003 現在不再相容。您還可以檢視有關 C 語言的更多資訊,請訪問 C 程式設計華夏公益教科書.
C++ 由 1998 年的 ANSI 標準定義(有時稱為 C++98)幾乎是,但並非完全是 1989 年首個 ANSI 標準定義的 C 語言(稱為 C89)的超集。C++ 不是嚴格超集的原因有很多,即並非所有有效的 C89 程式都是有效的 C++ 程式,但將 C 程式碼轉換為有效的 C++ 程式碼的過程相當簡單(避免保留字,透過強制轉換繞過更嚴格的 C++ 型別檢查,宣告每個呼叫的函式,等等)。
1999 年,C 被修訂,並增加了許多新特性。截至 2004 年,大多數這些新的“C99”特性不在 C++ 中。有些人(包括 Stroustrup 本人)認為 C99 中帶來的更改與 C++98 在 C89 中新增的更改具有不同的理念,因此這些 C99 更改旨在增加 C 和 C++ 之間的相容性。
這些語言的合併似乎是一個死問題,因為 C 和 C++ 標準委員會的協調行動並未取得實際成果,可以說這些語言開始出現分化。
一些差異是
- C++ 支援函式過載,這在 C 中不存在,尤其是在 C89 中(可以爭論,根據函式過載的定義鬆散程度,可以使用 C99 標準在一定程度上模擬這些功能)。
- C++ 支援 繼承 和 多型性。
- C++ 添加了關鍵字 class,但保留了來自 C 的 struct,具有相容的語義。
- C++ 支援類成員的訪問控制。
- C++ 透過使用 模板 支援泛型程式設計。
- C++ 使用自己的標準庫擴充套件了 C89 標準庫。
- C++ 和 C99 提供不同的複數功能。
- C++ 將 bool 和 wchar_t 作為基本型別,而在 C 中它們是型別定義。
- C++ 比較運算子返回 bool,而 C 返回 int。
- C++ 支援運算子過載。
- C++ 字元常量具有型別 char,而 C 字元常量具有型別 int。
- C++ 有特定的 強制轉換運算子 (
static_cast,dynamic_cast,const_cast和reinterpret_cast)。 - C++ 添加了 mutable 關鍵字來解決物理常量和邏輯常量之間的不完美匹配。
- C++ 透過引用擴充套件了型別系統。
- C++ 支援 成員函式、建構函式和解構函式,用於使用者定義的型別來建立不變數和管理資源。
- C++ 支援 執行時型別識別 (RTTI),透過 typeid 和
dynamic_cast。 - C++ 包含 異常處理。
- C++ 有std::vector作為其標準庫的一部分,而不是 C 中的可變長度陣列。
- C++ 將
sizeof運算子視為編譯時操作,而 C 允許它成為執行時操作。 - C++ 有 new 和 delete 運算子,而 C 使用 malloc 和 free 庫函式。
- C++ 支援面向物件程式設計,無需擴充套件。
- C++ 不需要使用宏,不像 C,它使用宏來進行小心地資訊隱藏和抽象(這對於 C 程式碼的可移植性尤其重要)。
- C++ 支援由 // 表示的單行註釋。(C99 開始正式支援此註釋系統,大多數編譯器都支援此作為擴充套件。)
- C++
register關鍵字在語義上與 C 的實現不同。
通常會有人推薦使用 C 而不是 C++(反之亦然),或者抱怨這些語言的某些特性。通常沒有決定性的理由在一般情況下偏愛一種語言而不是另一種語言。大多數試圖將程式設計師工作效率作為程式語言函式進行測量的科學研究將 C 和 C++ 評為基本相同。C 可能更適合某些情況,例如核心程式設計,例如硬體驅動程式或關係資料庫,這些情況不適合面向物件程式設計。另一個考慮因素是 C 編譯器更普遍,因此 C 程式可以在更多平臺上執行。雖然兩種語言仍在發展,但新增的任何新功能仍然保持與舊程式碼的高度相容性,使程式設計師可以決定是否使用這些新結構。在專案中建立規則以限制使用語言的一部分(例如 RTTI、異常或內部迴圈中的虛擬函式)並不罕見,具體取決於程式設計師的能力或專案的需要。新硬體首先支援較低級別的語言也很常見。由於 C 比 C++ 更簡單、更低階,因此更容易檢查和符合行業指南。C 的另一個好處是,程式設計師可以更輕鬆地進行低級別最佳化,儘管大多數 C++ 編譯器可以自動保證幾乎完美的最佳化。
最終,程式設計師可以選擇最適合工作的工具。如果可用程式設計師只知道 C,那麼很難證明選擇 C++ 來進行專案。即使在相反的情況下,預計 C++ 程式設計師會生成功能性 C 程式碼,但所需的思維方式和經驗並不相同。同樣的推理也適用於 C 程式設計師和 ASM。這是由於這些語言的結構和歷史演化之間存在密切關係。
有人可能會認為,僅使用 C++ 編譯器編譯的 C++ 的 C 子集與只使用 C 相同,但實際上,根據使用的編譯器,它可能會生成略有不同的結果。