C 語言比 C++ 更強大嗎?

如題,有人說c++的出現是為了開發大型應用方便,那操作系統開發不更加大型複雜嗎?還不是一樣用c語言等,而且c++也包括了c,為何就不能代替c?另外,c++可以理解為c語言寫的功能的封裝?


這個問題實際上是在問「和C相比,C++適合哪些領域?」

首先所有圖靈完備的語言都是同樣強大的,都能實現任何計算,從這個角度來看,C並不比C++強大,反之亦然。

不談圖靈的話,語言的區別除了性能之外,也就是表達能力了,從這點來看,C++要比C強大,當然也要比C複雜。C++從誕生之日起,其設計哲學就崇尚複雜的問題要用複雜的工具解決,現代C++的定位是零開銷的高級抽象語言:用各種高層次的抽象能力,在不損失性能的條件下解決複雜的問題,理解了這個設定,你才能理解C++的強大之處。

操作系統kernel並不是已知最複雜的軟體,編譯系統就絕不比kernel簡單,正如 @任衛 所說,kernel只是操作系統的一小部分,編譯系統和shell(GUI or CUI)都是其不可缺少的一部分,而這些都可以並且已經在基於C++編寫,如這條舊聞《GCC"s move to C++》和這個問答《What Languages are Windows, Mac OS X and Linux written in?》,十幾年前泄露的windows 2000代碼證實了後者的真實性。

關於其它複雜的軟體,可以參考Bjarne Stroushup的主頁中C++應用一節,當然這是一份非常不完全的列表,但以足夠證明C++的強大,試舉一二:

Adobe Systems: All major applications are developed in C++:

  • Photoshop ImageReady,
  • Acrobat,

Apple: OS X is written in a mix of language, but a few important parts are C++. The two most interesting are

  • Finder
  • AppleWorks

Amazon.com: Software for large-scale e-commerce.

BeOS: a multiprocessor multimedia personal operating system. 不多的完全基於C++的操作系統,喬布斯的仇人讓.路易.加西的作品,當年在蘋果競標Mac OS,PK敗給了喬布斯的Next系統,現在貌似開源了,水平其實還不錯

Clang and LLVM clang: a C language family frontend for LLVM. All of the LLVM tools and libraries are written in C++ with extensive use of the STL.

Google: web search engine, etc.

  • Chromium browser.
  • Google file system.
  • MapReduce large cluster data processing.

IBM:

  • OS/400.
  • K42: a high performance, open source, general-purpose operating system kernel for cache-coherent multiprocessors.

Microsoft: Literally everything at Microsoft is built using recent flavors of Visual C++ (using older versions would automatically cause an application to fail the security review). The list would include major products like:

  • Windows XP, Vista, System 7
  • Windows NT (NT4 and 2000)
  • Windows 9x (95, 98, Me)
  • Microsoft Office (Word, Excel, Access, PowerPoint, Outlook)
  • Internet Explorer (including Outlook Express)
  • Visual Studio (Visual C++, Visual Basic, Visual FoxPro) (Some parts of Visual Studio like the Base Class Libraries that ship with the .NET Framework were written using C# but the C# compiler itself is written in C++.)
  • Exchange
  • SQL

Symbian OS: rationale: "[...] using C++ for all system code, from the kernel upwards." This is one of the most widespread OS"s for cellular phones.

Games: Doom III engine, Blizzard: StarCraft, StarCraft: Brood War, Diablo I, Diablo II: Lord of Destruction, Warcraft III, World of Warcraft. Microsoft: all games. EA: video game engine.

MongoDB: An open-source database, widely used as the back end store for web applications, as well as in large enterprises like Viacom and Disney.

MySQL: MySQL Server (about 250,000 lines of C++) and MySQL Cluster. Arguably the world"s most popular open source database.

這個列表可以證明幾件事情:

  1. C++在所有現代操作系統中都佔有一席之地(KDE、Windows、Finder),如果你要問為什麼這些OS不用C++寫kernel,可以參考這個問答:The very short answer is that no entirely new operating systems of any significance have been created at all since C++ attained maturity in the late 90"s. And using C++ is not, by itself, nearly a compelling enough reason to completely re-write an existing successful OS. OS/400和K42不了解,暫時也歸於非C++ kernel吧
  2. 完全用C++寫的實用操作系統也並不是沒有(BeOs、Symbian,p.s. 這兩家公司倒閉完全是因為經營不善而不是用C++寫了kernel);
  3. 遊戲領域是C++的大本營(p.s. 這裡有卡馬克關於C/C++的一篇非常公允的比較,I do think "good C++" is better than "good C" from a readability standpoint, all other things being equal.
  4. 這世上比kernel複雜的軟體有很多,只寫過點server端C代碼的人完全無法想像photoshop、chromium、MySQL、Office這類軟體如何用C搞定,而C++是這類軟體的最佳解決方案
  5. 互聯網時代,C++也工作得不錯,Google、Facebook、Amazon的關鍵組件都用C++,流行的MongoDB和MySQL等資料庫軟體也是基於C++,更不用說當下流行的深度學習框架十有八九也是基於C++

每門語言都有自己的強大和不足之處,C和C++相比,前者的強大和不足都來自簡潔,後者的強大和不足都來自複雜。你不能說簡潔比複雜好,也不能說複雜比簡潔好,就像你永遠不能騎自行車去月球探險,也不會開飛船去樓下超市買水果。簡潔的問題用簡潔的方法解決,複雜的問題用複雜的工具解決,這才是生存之道。


我發現推崇C,蔑視C++的基本是兩種人:

一種人是超級大牛,其實大牛牛的是人,並不是他用什麼語言,如果說某大牛說自己只用XX語言,你應該點下頭,說句牛就行了。跟我等凡夫俗子沒什麼關係,不是大牛用什麼咱也用能成大牛。

另一種人就是半吊子,不管C和C++都是半吊子,或者就叫一知半解。C++包含了C基本上所有的功能,怎麼可能不如C強大呢? 說C++比C複雜那是肯定的,但是論強大,當然還是C++強大,那些鄙視C++的大牛其實也並不是鄙視語言,而是鄙視那些半吊子程序員,學的不好亂用語言特性,會把好端端的項目搞砸了,C++的語言特性太多了,而且有些很容易被半吊子用錯。其實C的項目也可能被半吊子搞砸。

關於C和C++,本人的觀念是這樣的,如果你做底層開發,比如開發一套跨平台,甚至供多種語言調用的API,肯定是需要用C,因為C的介面可以在各種環境下通用,實際上你用C++寫個庫如果是供其他語言調用,很可能也需要封裝開放為C的介面。導出類可不能重用。其次,某些領域,比如網路開發,其實不需要OOP,或者其他C++的特性,用C反而更簡單,此時應該用C,這類項目就像Go所追求的目標環境,或者是操作系統內核那樣的開發。

但是另一些領域,比如你開發一個2D、3D圖形應用, 不用C++是絕對不可能的,不管是已有的輪子還是自己造輪子都不可避免走向C++之路,因為圖形很多時候就是面對對象的,例如涉及到計算幾何, 用C++的很多特性,封裝、操作符重載,可以很簡單的寫一些類,比如實現向量簡單的加減法,實現出來很漂亮,且容易使用,但是如果用C實現,就都要寫成函數,可以想像一下,一個大工程裡面,到處是 C= Add(A, B)這樣簡單還是 C= A+B這樣簡單直觀?用C寫的大工程維護起來比C++難度大N倍,這是因為C++提供了比C更好的抽象,所以可以提高代碼的可讀性和可維護性,並且只有很少的犧牲,用C確實也可以實現C++的部分OOP特性,但是不是全部,不適合做大項目。

最後我覺得一個好的工程結構是這樣的,把一個大項目分為很多小模塊,模塊之間的介面是C的,一些需要性能不需要OO的部分用C寫,一些天然是對象的部分,比如GUI,用戶操作,用C++實現,C和C++完全可以在一個工程里混用,或者如果不喜歡C++的某些部分,完全可以不用,你把C++當好點的C用也完全可以。最後項目的二次開發用Python等腳本語言來支持,C做C++和Python之類腳本的中介。這是我最喜歡的項目結構。也是很多項目採用的結構。

說點感想,最近我在研究一個東西,正好就有一個C++版本,還有一個C的版本,C++版本非常完善,高效且容易使用,而那個C版本雖然表面上實現類似功能,但深入下去發現就是垃圾。更關鍵的是我的重用,當用C++重用時,都很自然,但是用C的版本,不是多寫一些東西的問題,而是一團糟。作者自己也承認,用C++可以實現的事用C很難實現。


我不回答別的,只說:操作系統並不是只有C寫的。

linux內核是C寫的,但操作系統不僅僅只有個內核。Gnome/ KDE / QT / Windows都是包含C++在內的多種語言寫成的。


這個世界上不存在什麼東西,是通過削減什麼來使得功能更強大的。


某日,兩小學生。A,B。

「泰羅奧特曼好強!」

「狗屁,迪迦奧特曼更強!」

「泰羅能放電!」

「迪迦能變色!」

「泰羅也能變色!」

「迪迦能變成三個顏色!」

「泰羅是奧特之母之父的兒子!」

「迪迦是遠古巨人!」

………………………

很久以後,他們在一起了...出了一個孩子叫「泰迪...」

(評論區精華抄襲..逃


先要定義什麼叫「強大」。

如果論功能多不多,C當然沒有C++多,所以C++更強大。

如果論簡單不簡單,C比C++簡單,那麼……就算C更強大吧。


操作系統真的「更加」大型複雜嗎?或許它在難度上很厲害,但複雜和困難是兩方面的概念,如某高票答案說的,這世界上比os內核複雜的軟體多了去了,而其中大部分在你用來可能只是一個簡單的app

C++實現的os也不是沒有,C++大體上兼容C,那我只用C with class,不就能實現所有C能做到的東東了么,而且還可以在需要用class的時候更方便一點點,或許C++還是不夠好,但也別跟它的「子集」來比嘛

當然了,說完全子集是不對的,不過差異的那些一般也不是很重要,比如ub的規定差異上衍生的一些奇技淫巧,印象中還沒有誰來大規模使用


不說別的,用c寫圖形方面,有那麼多庫給你用嗎?針對方向都不同,不接觸底層,單片機和性能沒必要碰c


C語言可以說幾乎是C++的真子集。C有的功能特性C++絕大多數都有,C++多了一堆更強大的特性,你也完全可以在C++中寫C風格代碼。論強大,當然是C++了。

當然了C語言還是有他的優勢的,畢竟相對於C++來說,更簡單啊(逃)


解決問題方面,C 和 C++ 是差不多的

使用語言特性玩花方面 C 離 C++ 還有很大的距離

吹噓自己語言多麼厲害的方面 C 程序員遙遙領先


要殺人的話,一把水果刀和「要你命三千」,你會選哪個?


題主,該起床去寫代碼了,少問這種問題,多讀讀書,不要只讀編程,讀點文學哲學歷史吧


首先,我有兩種互相矛盾的觀點。

第一,經過大量的編程訓練和思考之後,幾乎所有人都會感受到一點,編程重要的是思想的輸出,工具只是想法的表達。無論使用什麼語言,厲害的思想總能找到它自己的基於特定編程語言的最佳表現形式。這麼看強大隻存在於思想。

第二,依然經過大量的編程訓練和思考之後,會體會到,編程語言是一種思想的延伸。就像人類語言和人類思想的關係一樣。每一種人類語言都代表一種世界觀,人生觀和思維模式,從而發展出的文化也非常不同。語言會影響思維,編程語言也是。這麼看更好的編程語言,會更容易激發人的創造力。

其次,編程語言強大是什麼,我的理解是,一種心理感受。編程語言讓人更容易表達自己的想法,讓人感覺到輕鬆簡單,讓人充滿靈感,就會給人強大的心理感受。這個心理感受非常的因人而異,很多因素都會影響。但如果一種編程語言,讓一些人受盡心理折磨,讓另外一些人心情舒暢,又以誰的標準來定義呢。

最後,我認為一種編程語言總是在不斷改進,變化,增加新功能,說明它還沒有找到一種純粹簡單的模式與應對外界層出不窮的變化。不能說不好,只能說在變的更好的路上,最終那些變化多端的形式,都會總結成統一而簡單的思想。所以,我認為c++的強大,是存在於心情舒暢和受盡折磨兩個陣營的人之間的爭論。

反觀c語言,做到了不是盡量加入一個特性,而是無法在去掉一個特性。它的不夠強大在於簡單,它的強大也在於簡單。舉一個例子,c++群里討論語法特性比較多,c群里討論實現功能思路的多一些。

我覺得有時候,消減掉一些東西就會變的更加強大,是化繁為簡的信息抽象,能夠更容易找到內心想要的東西,less is more。

c和c++誰更強大,人在挑選工具,工具也在挑選人。安利一下我用C語言開發的遊戲引擎,和c++的遊戲引擎,會有完全不一樣的感受,並且給出了用C開發大型複雜項目的解決方案,不遜色於c++。Talk is cheap, code is here scottcgi/Mojoc


我看來不是的。

主要是cpp完全兼容c,所以cpp必然是比c更強大。

一個語言除了基本的運行時,語法規則之外,還包括對應的標準庫。雖然cpp的標準庫很被詬病,但相對c也是要完善一些。

純c在我看來,優勢就在於足夠簡潔,那就相對容易理解,不至於像cpp那樣經常碰到不熟的語法需要google。以至於我甚至可以知道編譯器做的所有事,生成的彙編也都在掌控之中。調試起來就方便很多。

cpp優勢在於很強大,支持的語法特性很多,所以你可以在這個基礎上玩出各種各樣的花樣。但出了問題…你應該祈禱它最好不要出問題。


我說下個人認為 C 可以比 C++ 強大的地方:

1) 操作系統通常都能欽定 C 風格的 ABI ,但對 C++ 風格無能為力。

2) OO 實現其實有很多種模式。 C++ 可以說取一種最簡單的,但對其他模式寫起來就比較麻煩。而 C 實現各種 OO 模式看起來更平等一些。

3) 某些類型細節。例如 VLA (變長數組)通常實現分配於棧上,C++ 實現一般無能為力;指代初始化器能讓全公開 struct 、數組的初始化更清晰;伸縮數組成員在特定情況能摳下幾個填充位元組,而標準 C++ 也是無能為力等。

4) (屬於某些個人愛好)譬如 C 的 struct 要求全部顯式操作,而 C++ 引入更多隱式操作等。


看到大家這麼想......

我就放心了!


最強大的是機器碼,然而問題是很少有人能通過最強大的工具寫出非常強壯的程序。C++之於C的進步之處是給程序員更多的精力用于思考程序的結構而不是整日苦惱於功能的實現,Java之於C++也是這樣。簡而言之就是開發效率的提高,寫出沒有錯誤的程序更加簡單。

C的強大主要在於它是一個承上啟下的語言,既不像彙編一樣晦澀,也不像C++一樣臃腫,被稱為新時代的彙編。


C++一生黑來了。

旁邊高票答案說c是自行車,c++是宇宙飛船。這比喻很不過關,c既不是自行車,c++也當不了宇宙飛船。

利益相關:c/c++二十年經驗,BAT某C++項目持續跟進八年,目前仍在編碼C++。

我們首先要明白c優勢在哪裡?c並不是簡陋的語言,而是一種簡潔的語言,c和c++一樣可以上天。在管理良好的團隊,兩者開發效率相差彷彿,而且c還有更大的優勢。

在兼容性和普適性上,c是所有編程語言中最好的,沒有之一,不要拿java來說事,jvm都是以c為基礎開發,任何一款機器,從刀片伺服器到pc到arm到單片機,開發出cpu後,廠家要做的第一件事就是實現一個c編譯器,然後才是操作系統和jdk等等,只聽說過不支持java的手機,沒聽說不支持c的單片機。

c的性能也好過c++,c++並不是設計里所謂的無損性能的高等語言,同樣的邏輯實現,c++比c通常至少慢10%,如果有大量構造大對象和深層依賴關係等,慢上個百分之三五十也是常事。

至於c++的那些面向對象、模板、異常等高級功能,雖然看上去很美,但是細用起來,諸多不爽。因為c++沒有運行時標準,各家實現得千奇百樣,舉個簡單的例子,發生異常後,我們希望列印異常堆棧的源碼文件名和行號,就是一件很費勁的事,這種在java/c#里都不算事的問題,佔了c++程序員知識庫的大頭,比如什麼構造不要拋異常啊之類的戒條,甚至谷歌c++開發規範里就明確禁止使用異常,把這些特性都拿掉,這時候c++寫起來和寫c已經差不多了。

另外c++以學術化為名,很多東西定義得無意義的複雜,就說模板標準,真正能完全滿足的編譯器是一家都沒有,做c++靜態代碼掃描的那都是活在地獄深處的孩子們。c++的的語法靈活性,導致了太多的不同風格,這對項目開發本身並不是什麼好事。

c++一直號稱取代c,看看最新的tiobe的排行

近幾年語言多起來,c和java的份額有所下降,但是號稱c終結者的c++已經在c後面吃了多年的灰了,看看五年前:

十年前

c++長久以來,就處來一個很尷尬的地步,拼性能兼容性不能和c比,拼項目開發的方便性不能和java比,兩不靠,雖然歷年各家都說要如何如何支持,最終還是無可扭轉的朝著小眾語言而去。不是所有的東西都能通過追加功能而變得強大,比如孫悟空用金箍棒為啥不變九齒釘耙,如意金箍棒想變啥變啥,九齒釘耙九個齒不但能殺人放血,還能挖地鋤草,明顯功能強多了不是?


語言的強大與否居然還被討論,只有適合不適合,沒有強大不強大。


c當然不比c++功能強大。但對很多大型項目來說,比開發語言特性強大更重要的是防止這些特性被濫用。

在你準備開始一個項目時,如果你想選c++做主要開發語言,你需要先做一個特性限制列表,以防後期踩雷。

1.採用哪個版本的c++標準。如果項目需要跨平台,跨編譯器,請謹慎採用新標準的新特性。

2.如果項目需要跨平台,請謹慎使用或禁用stl。

3.在與第三方庫交互和對效率要求高的場景下禁用異常。

4.禁止操作符重載防止語義混淆。

......

如果你想省去麻煩躲開所有雷區,你的選擇就是c語言。


推薦閱讀:

如何評價 C++14 ?
【for(int i=10, j=1; i=j=0; i++, j--)()】將循環幾次?
無編程基礎,跳過C直接學C++,壞處是學習難度陡峭,還是會有知識缺陷,還是二者都有?
關於《深度探索C++對象模型》有一段話看不懂?
輪子哥可以分享一下曾經是怎樣帶學生的嗎?

TAG:編程語言 | 編程 | C編程語言 | 面向對象編程 | C |