簡體   English   中英

如果我對 c++ 的理解有誤,請糾正我

[英]correct me if my understanding of c++ is wrong

如果我目前對 c++ 的以下任何理解有誤,請糾正我:

  1. C++ 是 C 的擴展版本。 因此,C++ 與 C 一樣高效。
  2. 此外,任何用 C 編寫的應用程序都可以使用 C++ 編譯器進行編譯
  3. C 語法也是有效的 C++ 語法
  4. C++ 與 C 處於完全相同的語言層次結構。

語言層次結構

例如。 最低層:匯編語言,高層:Java、PHP等

所以我的解釋是

C++/C is at a lower level than Java,PHP etc since it's closer to hardware level (and therefore because of this,it's more efficient than Java, PHP, etc), yet it is not as extreme as assembly language....但是 C++/C 彼此處於同一級別,並且沒有一個更接近硬件級別

  1. 如果您從 C 和 C++ 合法的代碼開始,它通常會編譯成相同的結果,或者足夠接近,效率只會受到最小的影響。

  2. 可以將不允許的 C 寫成 C++(例如,使用名稱與 ZF6F87C9FDCF8B3C3F07F93F1EE8712 中添加的關鍵字之一相同的變量,例如new 9712C)。 然而,大多數這樣的情況是微不足道的,因此它們在 C++ 中是允許的。 可能最難轉換的情況是使用 function 聲明而不是原型的代碼(或使用完全沒有聲明的函數,這在舊版本的 C 中是允許的)。

  3. 見 2 --一些語法 C 不能作為 C++ 工作。 如前所述,轉換通常很簡單。

  4. 不,不是。 盡管 C++確實提供了與 C 相同的低級操作,但它也具有 C 所缺乏的高級操作。

1/4 和 2/3 似乎在說非常相似的事情,但是:

  1. 是(取決於您所說的“擴展”是什么意思,但在廣義上,是的)
  2. 不總是
  3. 不總是
  4. 是的

此外,任何用 C 編寫的應用程序都可以使用 C++ 編譯器進行編譯

並非每個 C 程序都可以使用 C++ 編譯器進行編譯。 There are some differences between C and C++ (keywords, for example), that prevent mixing C and C++ in some ways. Stroustrup 在C 和 C++: Siblings中提到了一些重要的點。

C++ 是 C 的擴展版本。 因此,C++ 與 C 一樣高效。

這取決於您使用的語言功能。 我聽說使用 OOP 可能會比使用更像 C 的方法帶來更多的緩存未命中。 我無法判斷這是否屬實,因為我沒有閱讀更多關於該主題的內容。 但這可能是應該考慮的事情。 這只是一個例子,性能不容易比較。

C++ 與 C 處於完全相同的語言層次結構。 語言層次結構,例如。 最低層:匯編語言,高層:Java、PHP等

編程語言通常分為第 1 代(機器代碼)、第 2 代(匯編語言)、第 3 代(命令式語言)、第 4 代(定義有點模糊 - 旨在提高生產力的特定領域語言,例如 SQL)、第 5 代(問題表達的典型語言,例如數學符號、邏輯或人類語言;Miranda、Prolog)。 參見例如http://en.wikipedia.org/wiki/Fifth-generation_programming_language及其鏈接。

從這個意義上說,C 和 C++都是第三代語言。 (As Jerry points out, so are PHP, Java, PERL, Ruby, C#...). 使用該標准,這些語言屬於同一個通用組......它們都是您必須告訴計算機如何解決問題的語言,但不是在特定於 CPU 的級別上。

不過,在另一種意義上,C++ 比 C 具有更高級別的編程概念,例如 Object 不需要告訴更高級別的語言(即 5GL) - 相反,他們只需要對問題的描述並知道如何解決整個問題域,他們會為您的特定情況找到可行的方法。

C++/C is at a lower level than Java,PHP etc since it's closer to hardware level (and therefore because of this,it's more efficient than Java, PHP, etc), yet it is not as extreme as assembly language....但是 C++/C 彼此處於同一級別,並且沒有一個更接近硬件級別

這有點令人困惑。 總結:

  • C++ 和 C 的跨度確實低於 Java/PHP,是的。
  • C++ 和 C 確實往往更有效,是的。 You can get a general impression of this at http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.html - don't take it too literally, it depends a lot on your problem space.
  • C++ and C both go as low as each other, but C++ has some higher level programming support too (though it's still a 3GL like C).

讓我們看幾個例子:

  • 位移:Java 被設計為比 C 或 C++ 更便於移植(有時會以犧牲性能為代價),因此即使使用 JIT,在某些平台上運行某些操作可能也會很方便。 如果您正在做相同的工作,並且關心 CPU 行為不同的邊緣情況,您會發現 C 和 C++ 將操作符行為留給實現指定。 可能需要為不同的部署平台編寫多個版本的代碼,最終獲得與 Java 幾乎相同的性能(但程序通常知道它們不會執行極端情況,或者不關心行為差異)。 在這方面,Java 已經抽象出一個低層次的關注點,可以合理地認為是更高層次的但悲觀的。

  • C++ 提供了一些更高級別的工具,例如模板(以及模板元編程)和多個 inheritance。 只要 function 簽名在編譯時已知(一些庫繞過此限制),編譯器通常提供低級工具,例如內聯匯編和從其他對象/庫調用任意函數的能力。 解釋型(例如 PHP)和基於虛擬機(例如 Java)的語言在這方面往往更差。

  • Java 還提供了一些 C++ 缺乏的更高級別的設施 - 例如內省,序列化。

一般來說,我傾向於設想 C++ 的范圍既低於又高於 Java。 換句話說,Java 與 C++ 跨度中間的一個部分重疊。 但是,Java 也有一些突出的高級特性。

PHP 是一種解釋性語言,它再次抽象出一些低級關注點,但通常也無法為更抽象或更健壯的編程技術提供良好的設施。 像大多數解釋器一樣,它確實允許對任意源代碼進行運行時評估,以及對 class 元數據等進行運行時修改,從而實現高級、強大但危險的非結構化編程方法。 這種事情在編譯語言中是不可能的,除非編譯器是在部署環境中發布的(即使這樣也有更多的限制)。

C++ 是 C 的擴展版本。 因此,C++ 與 C 一樣高效。

一般是真的。

此外,任何用 C 編寫的應用程序都可以使用 C++ 編譯器 C 語法也是有效的 ZF6F877C9FDCF8EEB3C2F 語法

有一些細微的區別,例如:

  • 在 C++ 中, main()必須具有返回類型int ,如果沒有遇到 return 語句,則在退出時隱式返回 0,但 C 允許voidint並且后者必須顯式返回一個int
  • C++ has additional keywords (eg mutable , virtual , class , explicit ...) that are therefore not legal C++ identifiers, but are legal in C

不過,您的概念基本上是正確的。

  1. 這並不完全正確,除了速度較慢的額外 C++ 語言功能之外,可以進行不同的優化來改變這一點。 由於更好的 C++ 類型系統,這些實際上通常對 C++ 有利。

  2. 不,一個大案例是 C++ 不支持從 void* 自動轉換,例如

    字符* c = malloc(10); // 是有效的 C,但不是 C++

    char* c = (char*)malloc(10) //在C++中需要

  3. 除了 C99 和更新的 C 功能外,我認為幾乎總是如此。 請記住,這僅考慮語法,這並不意味着可以在 C 中編譯的所有內容也可以在 C++ 中編譯。

  4. 您能否詳細說明您的意思,“語言級別層次結構”是什么意思?

概括:

  1. 真的。
  2. 危險的虛假。
  3. 錯誤的。
  4. 主觀

2/3的一些例子:

  • sizeof 'a'在 C++ 中為 1,在 C 中為sizeof(int)
  • char *s = malloc(len+1); 是正確的 C 但無效的 C++。
  • char s[2*strlen(name)+1]; 有效(盡管危險)C,但無效 C++。
  • sizeof (1?"hello":"goodbye") is sizeof(char *)` 但在 C++ 中是 6。

嘗試將現有的 C 代碼編譯為 C++ 是完全無效的,並且即使您查找並“修復”所有編譯時錯誤也可能產生危險的錯誤。 編寫在兩種語言中都有效的代碼可能是多語種比賽的合理入口,但不適合任何嚴肅的用途。 C 和 C++ 的交集實際上是一種非常丑陋的語言,是兩全其美的語言。

這是一個很大的問題要回答。

  1. 並非在所有情況下!
  2. 不正確,因為 3
  3. 不對
  4. 它們並不完全相同

我不認為語言級別的層次結構對一件事來說太重要了。 例如,C 與匯編語言相比是高級語言,而與 Java/C# 相比是低級語言。

您的某些觀點的理解是錯誤的:

1)你的第一點是對的。C++是c的擴展。

2)第二點是對的。 C 可以使用 c++ 編譯器進行編譯。

3) 一些 C 語法與 c++ 不同。 In c++, using structure, c should specify structure name but c++ it is not mandatory to specify structure name.Also C++ have the concept of class that is not available in c. C++也有更高的安全機制。

4)C 是過程語言,但 c++ 是面向 object 的方法。 所以 c++ 與 c 的語言層次結構不同。

  1. C 語言不是 C++ 語言的子集。 例如,檢查 C99 規范 - 它不會在 C++ 編譯器中輕松編譯。 但是大部分 C89 源代碼可以復制並粘貼到 C++ 源代碼中。 與裸機相比,C 和 C++ 是可以以“零開銷”實現的語言。

  2. 不,但大多數 C++ 編譯器也是 C 編譯器。 這意味着您可以使用相同的工具鏈編譯.C 和.C++ 文件。

  3. 不,這些語言的演變是不同的。 見問題 1 的答案。

  4. C++ 是多范式語言。 是的,可以和 C 一樣使用。 但它也可以用作 DSL——它提供了更高的抽象級別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM