回覆列表
  • 1 # 大飛玩轉積木

    C是一個結構化語言,它的重點在於演算法和資料結構。C程式的設計首要考慮的是如何透過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事務)控制),而對於C++,首要考慮的是如何構造一個物件模型,讓這個模型能夠契合與之對應的問題域,這樣就可以透過獲取物件的狀態資訊得到輸出或實現過程(事務)控制。

    所以C與C++的最大區別在於它們的用於解決問題的思想方法不一樣。之所以說C++比C更先進,是因為“ 設計這個概念已經被融入到C++之中 ”,而就語言本身而言,在C中更多的是演算法的概念。那麼是不是C就不重要了,錯!演算法是程式設計的基礎,好的設計如果沒有好的演算法,一樣不行。而且,“C加上好的設計”也能寫出非常好的東西。

    對語言本身而言,C是C++的子集,那麼是什麼樣的一個子集?從上文可以看出, C實現了C++中過程化控制及其它相關功能,而在C++中的C(我稱它為“C+”),相對於原來的C還有所加強,引入了過載、行內函數、異常處理等等玩藝兒,C++更是拓展了面向物件設計的內容,如類、繼承、虛擬函式、模板和包容器類等等。

    再提高一點,在C++中,資料封裝、型別這些東東已不是什麼新鮮事了,需要考慮的是諸如:物件粒度的選擇、物件介面的設計和繼承、組合與繼承的使用等等問題。

    所以相對於C,C++包含了更豐富的“設計”的概念。

    C++與C比有什麼缺點呢?

    一、類,類我並不說它有什麼不好,但是對於初學者,它是一個累贅。類的封裝使得初學者對程式產生厭倦,感到不適和麻煩。

    二、引用,引用是C++中最臭屁的東西了,最好儘量不要用它,除非萬不得已。引用對於初學者就更容易產生混淆,不知道哪個是引用,哪個是變數。

    三、函式的過載,初學者學函式的過載好像沒什麼壞處,但是,這會使初學者潛意識裡對C語言的變數型別的重要性產生淡化,要記住C語言是對變數型別最敏感了的,變數的型別在C語言裡的重要性是不言而喻的。

    四、流運算子,和上面同樣的道理,使得對變數型別的重要性產生淡化,況且,cin這個東東有點兒不怎麼方便,有時會產生使初學者莫名其妙的結果。

    五、運算子過載,典型的高階應用,初學者可能根本用不著,會讓他們覺得C++很難,門檻高,看不懂。

    六、繼承,以及虛擬函式,典型的模仿四不象,這種狗屁東西除了看起來深奧,實用價值很低,例如:把某個類的型別的指標去指向另一個不同型別但是是繼承關係的類,來實現動態聯編等等。

    學習c可以鍛鍊人的程式設計思想。一個好的程式設計思想,絕對比一門好"計算機語言重要的多。要形成自己的程式設計風格。一個好的程式設計思想在你的頭腦中一旦形成,學習什麼語言都會很輕而易舉,因為此時的你不在是簡簡單單的學習,而是來驗證!

  • 2 # 鼴鼠科技

    C語言是結構化和模組化的面向過程的語言,而C++語言是面向物件的程式設計語言。C++語言是C語言的超集,也就是說學會了C++,你其實已經把C語言學會了。

    區別就是,C是基於過程的,強調的是程式的功能,以函式(功能)為中心。C++是面向物件的,強調程式的分層、分類,以抽象為基礎,進行物件的定義與展示,即物件建模和應用設計模式等概念。

    不過用過這兩門語言程式設計的人,C語言可以實現面向過程,也可實現類似的面向物件比如結構體封裝,但用法上沒有比真正有面向物件的C++高效和方便,只因為C++多了一個類的管理。而C++完全可以向下相容C,即可以面向過程,也可以面向物件,我們常說C++是一種半面向物件的語言,但它完全可以面向過程。高階的系統程式設計,多執行緒,資料結構等等C++也可以做到,只不過出於執行效率和記憶體佔用考慮,C的優勢使它趨向於底層,如資料庫實現(例如redis和mysql),作業系統(Linux,Unix,Windows),還有嵌入式程式設計,核心驅動等,越精簡質量越高。對比C++,它更像是基於系統上的上層語言,可以做大型軟體,介面開發,遊戲開發等等等等。誠然,《C++ Primer Plus》中也說過,把C的繁雜的實現過程抽象成型別並且例項化來管理,是C++設計之初的動機,也就是OOP思想。使用者可以自定義型別,並且可以不斷往裡面新增和拓展,必須修改的時候不需要大改全域性,而只需要改區域性,這就是OOP的優勢之一。兩者的側重點會點不同,C更注重實現邏輯,C++更注重的是程式的整體設計,這就是常說的面向過程和麵向物件,其本質還是在其設計思想上,C++更加開放和自由,程式碼維護和管理更加高效。

    總之,根據你的實際專案需要和應用環境來選擇。

  • 3 # 和不同

    超集優於子集?

    首先,作為語言,超集未必好於子集。

    比如:古代日語可以認為是古漢語的超集,古漢語只有漢字,而日語既有漢字,還有假名。這並不能說明古日語一定好於古漢語。

    相反,無論是現代漢語還是現代日語,都經歷了一個精簡(變為自身子集)的過程,如日語將可用漢字數量大幅度減少,漢語減少了異體字的使用,茴香豆的茴字寫法不會增多,反而會減少。

    C語言的優勢

    僅僅指C語言相對於C++的優勢。

    學習容易:相對於複雜的C++,C語言的學習成本要低多了

    程式碼易讀:由於簡單,程式碼也翻不出C++那麼多花來,一個C程式設計師寫的程式碼,另一個C程式設計師容易讀懂

    移植方便:由於簡單,C編譯器很容易支援完整的C語言標準,相對於C++,C語言原始碼在不同編譯器之間移植的要容易多了

    編譯速度快:相對於C++,C程式碼的編譯速度快多了,當一次編譯動輒數小時的時候,編譯速度那是相當重要

    啟動簡單:在編寫Bootloader時,也許十幾行彙編程式碼就能建立一個可用的C執行環境,一個跳轉進入C目的碼執行,脫離彙編的苦海;而要建立一個可用的C++執行環境?恐怕還得在苦海里多寫幾十行甚至上百行彙編程式碼。

  • 4 # 愛思考的奧特曼

    C++和C語言的側重點不同,並不能說C++一定比C語言優渥。

    作為一個前嵌入式工程師,我對這兩種都有一定的瞭解,接下來我們具體分析一下這兩種程式語言。

    C語言重在底層開發,C++偏向於應用開發

    雖然說C++是從C語言的基礎上進化而來的,但是嚴格來講,這兩個語言並不能類比。

    ,這兩種語言各有各的優勢和特點。C語言的好處在於語法簡單,市面上這麼多程式語言,很難找到一個比C還通俗簡單的程式語言了。同時,C語言還是處理底層硬體和軟體互動的“利器”。

    只要是學過C語言的朋友,就一定會被C語言指標處理精妙的設計思路所折服。並且C語言的程式碼量很小,執行速度比較快和功能強大,這樣的特點用來編寫系統最為合適不過了。比方說,眾所周知的linux,unix,以及windows系統的核心,都是用C語言編寫的,可見C語言在程式設計界的重要性。

    再說C++,從名字上也能看出來,C++是C語言的“進階版”。首先,C++可以說是各類程式設計技術思想的集大成者,無論是在型別還是語法上C++都要豐富很多。如果光把C++認為是C的超集,是遠遠不夠的。從語言特點上來說,C++兼具面向過程和麵向物件的思想,因此,在C++中可以和C語言一樣的使用main函式,而其他地方可以和java、C#一樣使用類,非常的靈活。C++語言上得了廳堂下得了廚房。面向物件的思想給快速開發提供了很大的支援,使用封裝的類,可以不用重複寫相同的程式碼。其他的地方,只要用你這個類就行。因為是封裝到了一個類,各種相關函式都放在一起,所以,使用上也就方便多了,而不像C語言的各種庫函式非常的零散,經常找不到有那些相關的函式。

    當然了,C++這麼強大,就註定了他是一門學起來非常困難的語言,在全世界範圍內,C++都是公認的,最複雜的語言。而且C++的開發效率,確實不是很高,相較於java和python等,顯得有些臃腫。

    所以綜上所述,因為C和C++的側重點不同,二者各有優劣,都是程式語言中極為重要的從在,所以C當然不會被淘汰啦!

  • 5 # VanKingQuan

    C語言編譯出來的檔案更小、執行速度也更快,對嵌入式開發特別是MCU開發還是很有優勢的,專案過於複雜還是C++更合適

  • 6 # TonyDeng

    cpp是C超集的說法是誤解,cpp之父曾解答過這個問題,自己去查。cpp編譯器是相容C的,這個做法的優勢是程式設計師可以衡量所程式設計序的側重點,互補。cpp相對C的優點,是其語法(法則)更嚴格,可控性更好,很多C特有的缺乏和陷阱(參考那本著名的同名書)都是針對性修改到cpp上的,你完全可以用cpp編譯器寫C程式而又避開那些煩人的陷阱。同樣,寫cpp程式也沒誰規定你一定要全部用cpp庫,追求效率的可以依然使用C的寫法封裝在類的程式碼中。這種用法,同樣也是cpp之父公開講過的。正因為cpp編譯器可以很好地編譯C程式碼,所以現在幾乎沒有專門的C編譯器了,都是cpp編譯器包攬。

    這些東西,其實就如金庸小說中學武功,你師傅是戚長髮三兄弟那樣教學,徒弟再優秀也是廢的,什麼都是融會貫通,不拘一格才好。我真見過某些學院派的高材生,訓誡別人說寫cpp不能用printf()只能用>>之類才正宗,這就是讀死書的,C和cpp兩派人互相鄙視,也是這些人。

    那些一開口說cpp要用啥庫啥庫、要什麼跨平臺的,也是半桶水。面向物件和麵向過程,也不是如某些人說的那樣截然不同,自己陰陽沒調和罷了——有面向物件思想的回頭寫C面向過程也一樣體現面向物件思維,同樣面向物件程式設計中也一樣要在方法函式中寫結構化面向過程程式碼。框架套多了才不知道真正的面向物件是怎麼寫。

  • 7 # jwzhang0809

    直接BB:

    1. C++雖然相容C,但是都是 extern "C"的。C++在生成二進位制時會名字重整,這個策略由編譯器決定;C的編譯出來的二進位制名字是確定的,不取決於編譯器實現。

    2.C++的模板程式碼如果跨編譯器和編譯設定項(如:CRT策略是多執行緒版或單執行緒),就會出錯。

    那麼:

    1. C除了學習上手成本更低以外,以組合(struct的實質)和功能(函式)為世界抽象的模型下,也是可以做很多很多工作的。加上對執行時庫的依賴小,這就符合了一些小型裝置的應用場景。

    2. 因為二進位制名的確定性,在做跨語言互動和應用外掛上就擁有了天然的優勢。比各個語言的擴充套件外掛都是基於C的,JAVA、C#、PHP、PYTHON無不如此。一般應用的外掛入口也會選擇extern “C”的函式,雖然也有直接做C++顯示依賴的。

    3. C編譯器相對C++更好實現,更易移植;程式開發的基礎先得有流程控制、資料抽象,這方面C是如果的經典。

    4. C++複雜的語法系統讓其編譯速度一直很痛苦,相對而言C就是如此的輕快了。

    雖然現在C的編譯器更多是學習用的,我想因為有這些特點也就決定了它的價值和需要。

  • 8 # sky165135137

    一方面,C比C++簡單,效率也比C++高,有些嵌入式系統也必須用C;另一方面,歷史遺留了大量的C語言程式碼,C++又不得不相容C,而這種相容性又導致更多的C程式出現。因此C不可能被淘汰,只能兩者共存,並且在應用定位上實際出現了分化,C更多用於小型專案,模組化專案,嵌入式專案,而C++偏向於中大型專案,兩者並沒有明星的界限,很多時候也是混著用,實際上已看成一種語言,就像是連體人!!!

  • 9 # jackson316

    看了這麼多人的評論,大多數人都沒說到點上,主要原因有兩點。一點是C語言開發的程式執行效率非常高,因此需要優先執行效率時,它基本是首選。驅動程式,windows核心,linux核心,opencv,ffmpeg,nginx等都是用C語言開發。相對於C++語言,C語言最大程度避免了堆記憶體的分配與釋放,儘量使用棧,而C++不可避免的要經常使用堆,頻繁的記憶體分配與釋放,造成效率低於C,C++類比如string,stl類,內部都有new的存在,而C語言只有不得已時才會用malloc。第二點是C語言標準統一,簡單,在各平臺的語法一致性很高,跨平臺能力強,而C++則標準多,編譯器實現上也有一些差異,以至於用C++做跨平臺的少

  • 10 # 哼哼online

    C和C++應用場景略有不同。C比較緊湊,適合要求效率高,程式碼容量小的應用,C++的程式碼開銷比C大,嵌入式應用不是很適合,系統底層的也不太適合,所以C++功能再牛,替代C也是不可能的,再者,沒有了C,C++的編譯器用啥開發。

  • 11 # Solo哦

    應該說是C比較早,C也經歷過很多版本 其實C++無非是在C的基礎上實現了面向物件的方法論。在C的基礎上實現面向物件的還有OC。

  • 12 # 靖2020哥

    c是面向過程的最經典的語言,也是除了彙編外最接近硬體底層的語言,是計算機專業學習作業系統,系統結構和資料結構的必備工具。目前linux核心,以及各種嵌入式系統裡,c依然活躍。

    而c++是在c上擴充了面向物件的程式設計方法,因為效能較好,早期是應用級開發的主力,但隨著軟體開發的不斷進步,c++漸漸失寵,原因是其語法隨著新標準的釋出原來越複雜,除錯也比較困難。JAVA,python,golang,rust等不斷登場爭奇鬥豔,逐漸佔據應用級開發的主流。其中,python在人工智慧領域,golang在雲原生領域幾乎構建了完整生態。而c++只在效能特別敏感的應用,以及legacy專案裡繼續使用。

  • 13 # 日衝資訊 黃

    每種語言都有它所適應的執行環境,不存在較高階語言淘汰較低階語言的事情。一種語言被淘汰通常是由於它所依賴的執行環境被淘汰了。

    C語言的執行環境是所有語言裡最簡單和最基本的。很多微控制器上沒有作業系統,都使用C語言直接編譯成機器碼,燒到晶片上就可以運行了。很多裝置上都使用專用的晶片(ASIC),這上面的程式也是用C語言編寫的。這些裝置上沒有顯示器、鍵盤、硬碟、儲存之類的外設,自然不需要作業系統,用C語言的基本庫寫出來的程式,可以脫離作業系統單獨執行。這些環境上只能用C語言寫程式。

    C++語言是可以跟C語言相容,但是它配備了強大的GUI、網路等程式庫。比如,GUI的程式庫需要有相應解析度的顯示器,以及驅動這些顯示器的作業系統。因此,C++語言的程式只能在配備了作業系統的計算機上執行。

    還有很多人問現在有不少高階語言如,JAVA、Python之類的,為什麼還需要C++?這些語言都比較適用於網際網路環境,為了突出跨平臺以及易維護的優勢,大都需要在作業系統之上再配置一整套的執行環境,從某種意義上處理效率特別是時間響應的精度是大打折扣的。C++程式直接在作業系統上執行,時間響應的精度僅次於C語言,適用於開發底層驅動以及工業控制系統。

  • 14 # 起點啥名字真是難

    C語言是提供一個功能完整的最小特性組合,就像是一把瑞士軍刀,你想幹啥都行,而且不怎麼需要特殊設計都有很高的效率,但是用起來費力。C++就像一個叮噹貓你要啥都有,但是你得自己搭配出最有效的路徑。

  • 中秋節和大豐收的關聯?
  • 現在結婚生一個還是兩個孩子好?