標籤:

C語言和C++ C#的區別在什麼地方?


按時間順序說一說這三門語言的基本吧,這樣比較一下兒就能知道他們的區別了。

一:C語言。

C語言誕生得非常早,當時人們普遍還習慣用彙編語言編寫軟體,而且沒有什麼統一,通用的操作系統,基本上軟體都是從0開始寫的。C語言的目標就是比彙編方便易用,同時不要損失彙編的表達能力。所以C語言可以看成是「高級的彙編」語言。C語言的源代碼基本上可以非常容易地對應到彙編代碼,而且可以不需要什麼運行時環境的支持。C的特點,簡單容易編譯,靈活貼近底層。所以一直到現在,一些需要直接和硬體打交道的軟體都還是用C語言寫的,比如(但不限於)Linux Kernel和一些嵌入式領域。

二:C++ 語言。

C++早期是基於C的,C++早期的編譯方法是將C++的代碼編譯成C代碼然後再調用C的編譯器來生成機器碼。C++的目標是提高編程人員的生產率,哪怕代價是增加編譯器的複雜度。而提高編程人員生產率的方法有如下幾種:提高抽象層次,支持模塊化編程,模塊內緊耦合,模塊間松耦合,自動化的代碼生成等等,這些在C++中都有體現(「有體現」不是說只有C++能做這些,理論上C++能做的事情C和彙編都能做,「有體現」是指C++裡面你可以更直接,更自然地做到這些)。面向對象只是C++的一部分,現代的C++的目標是支持多種編程范型,同時並不會離硬體太遠。所以C++是非常適合寫一些基礎架構級軟體的,比如編譯器,GUI庫等等。

三:C#以及.net框架。

時光荏冉,歲月如梭。當進入21世紀的時候,Java的成功已經變成了鐵一樣的事實。背後的思潮就是managed code的崛起,與之對應的就是C/C++這種native code的衰落。當計算機的性能越來越好,但是好的碼農卻越來越少,然而對代碼的需求卻越來越高的時候,業界的選擇只剩下一個:運行性能換開發效率,降低從新手到一般可接受水平的曲線。C#就是微軟想要複製Java的成功。C#的特點就是:抽象層次高且基本只有一種(面向對象的),運行時支持豐富(垃圾回收等),類庫豐富。所以它就是好學,易用,同時兼顧運行效率,盡量優化。說起這個,並不是說越高級的語言就越慢,運行時性能跟很多東西有關。


C:高級彙編

C#:寫起來很爽但性能不好優化

C++:我想控制一切要高性能但是又要寫起來舒服怎麼辦好急啊在線等


本人最近的工作剛好跟 C# 和 C++ 都要用。C寫得不多。

本答案繼承 張景旺 的一些思路。比較側重關心這三種語言的(我所理解到的)設計思路。

這三門語言的誕生都是為了解決當時軟體開發的一些痛點。

C語言主要解決的問題是,不同機器平台上的彙編語言指令,功能相似但寫法不一樣。

所以,

C語言的發明者的想法是,我只要把這些不同的彙編語言的共同點提取出來,用一種相同的表達方式來描述這些共同點,那麼程序只需要寫一遍,就可以在不同的機器上去編譯了。於是C語言大部分的工作是在彙編語言的層面上做抽象。

如果要選最能體現上述思路的 C 語言作品,我選 CURL 和 openssl 。這也是我認為 C語言最適合的應用場合。

C++ 主要想解決的問題是,不同操作系統上的 API 功能相似但是形式不同;這些功能相似的代碼很難用同一種形式的 C語言表達出來(所以要有面向對象和模版),硬要用C的話對軟體工程組織的挑戰太大。

所以,

C++發明者的想法是,我只要捏合一些規則,使得基於不同OS的但功能相同的代碼能夠以同一種形式寫出來。於是現在我們用 C++ 的話可以比較容易地(並且看起來是唯一成熟的, Rust 我認為尚未 ready)寫出跨平台可編譯的用戶軟體項目。

如果要選一個最能體現上述思路的 C++ 作品,我選 asio,儘管我並不覺得它比 libev 或者 libuv 好,但是最能體現 C++ 的思維方式。超過這種複雜度的工程,用 C++ 來做的話很勉強了。

C#(以及很多機遇VM的編程語言,例如 Java)主要想解決的問題是,不同平台上的底層細節很多時候並不是最需要關心的內容,主要關心的是多機器上運行的同一款軟體應該如何組織和實現,甚至這些機器之間的協作。

所以,

C# (或者Java) 發明者的想法是,我只要提取出圖靈機的基本共同點(於是造出 VM),讓寫出來的程序都是基於這些共同點(於是發明了 IR 或者 Java byte code),讓實際部署的時候再編程實際環境的二進位代碼(通過 JIT 技術),那麼成員就可以不必關心程序運行的細節,專心在軟體的高級邏輯上。

如果要選一個最能體現上述思路的作品,我會選 LinqToDb,目前這個作品功能還很弱甚至還不為眾知,但是它的基本思想(將運算邏輯傳遞到實際運算的地點再執行)以及發展基礎(C#, Linq 以及CLR)都是非常完備的。


其實吧,個人感覺就是:

任務:把大象放到冰箱里。


C:

C語言是一個極其高冷的人,因此回答都是冷冷的:

我:你好C語言,我想把大象放到冰箱里,幫我做好不好?

C:好

我:那我們要怎麼做呢?

C:猜

我:額。。。是不是應該先創造一隻大象?

C:是

我:怎麼創造呢?

C:猜

我只好去翻了一下文檔,哦,malloc一塊內存啊。

我:好的,我用malloc,申請一塊空間放大象好不好?

C:好

我:額。。。大象怎麼構造呢?

C:猜

我。。。去看了看大象的結構

我:好吧。。。我定義了一個大象的數據結構,接下來怎麼做?

C:猜

我心裡一陣說不出的感覺。。。

我:哦好吧,我創造一個冰箱,步驟應該和大象差不多。

C:嗯

我翻看了冰箱的結構,然後定義了一個冰箱的struct。

我:好了,冰箱構造出來了,怎麼放呢?

C:哼

我。。。默默在Stack Overflow上輸入"如何把大象放進冰箱 C"。

我:終於找到答案了,定義一個方法,把大象的鼻子放進去、眼睛放進去、耳朵放進去。OK,都放進去了。C,你輸出一下看看吧。

C:燙燙燙燙燙燙燙

我:哈哈哈哈C你終於不高冷了

。。。

我:哎,你咋不說話了?C?你發燒了嗎?

立刻一盆水倒上去。

結束。


C++:

C++是一個知識淵博的孩子,相對年輕,也沒那麼高冷。

我:C艹,我們把大象放冰箱好嗎?

C++:滾

說話的不高冷呢?

我:額我錯了,親愛的C++,我們把大象放冰箱好吧。

C++:好的么么噠,大象的數據類型已經有人定義好了,冰箱也有人定義好了,你需要分別構造一個哦。

我:好的。

於是我翻看了文檔後知道了用new來構造

我:OK,親愛的C++,我想構造一個大象。

C++:好的,構造大象的方法有13個,請問你選擇哪一種呢?

我。。。

我:你介紹一下吧。

C++:OK,首先可以在棧上面構造,這麼做的好處呢是可以方便資源管理,而且語法也好看一些,可以利用RAII,如果你不知道什麼事RAII,你可以去cppreference上面查一下,當然你也可以在堆上構造,可以構造一隻很大很大的大象,還有。。。。。。。

一個月過後,C++終於講完了。我也長滿了鬍鬚。。。颳了鬍子之後繼續工作

我:好的,C++,我就在棧上面構造一隻大象吧。

C++:你不愛我了。

我:???

C++:你都沒有說「親愛的」。

我。。。

我:好吧,親愛的C++,我想簡單構造一隻大象。

C++:好的呢,你可以選擇構造一隻非洲象還是美洲象還是南極洲象,象的膚色是什麼樣子的你可以設定一下,象的屁股大小你可以設定一下,象的性別和性取向你看要什麼。。。。。。

我:我就想要一隻簡單的,默認的就好。

C++:好的,構造出來了一隻,你可以選擇怎麼初始化它,有13種初始化方法,推薦使用最新的統一初始化。

我。。。

我:統一初始化

C++:好的,我們可以構造冰箱了。

我:好。。。

經過一個月的選擇,終於構造出了冰箱。

C++:好的,冰箱提供了addElephant方法,可以直接使用哦。

我:哇太棒了,好的,我就用這個方法。

C++:這個方法提供了多種重載,可以拷貝,移動,也可以直接轉發,省的在移入冰箱之前構造一個大象。

我:。。。你為啥不早說

C++:你為啥不早問。

我:就用移動的吧。

C++:OK,請用std::move將構造好的大象轉為右值引用。

我一臉懵,但是還是照辦。

我:好了

C++:OK,開始放入冰箱了哦,速度極快的呢。

突然

C++:報錯了報錯了,分子和原子不是可以轉換的類型,大熊貓和愛迪生之間沒有+運算符等1556項錯誤。

我。。。。。。。。。

我:網上找資料,說看最後一行就差不多了,好的看看。嗯,看起來是第31行出錯了,錯誤是什麼呢?報錯信息啥也沒說明白啊。隨便改改吧。編譯,運行。

C++:好的,已經將臀圍12米,左臂長13米,右臂長14米,喜歡公大象,沒有結婚生子,從小家教不錯,熟讀四書五經的非洲母大象放入橘黃色,五十米高,六十米寬,三百米厚,溫度有零下三百度,製冷劑的牌子是湖澈牌,額定電壓220V的冰箱里。

我。。。長舒了一口氣。


C#:

我:我想把大象放進冰箱。

C#:好的主人,我爸爸微軟已經寫好了大象類,也寫好了冰箱類,你只需new一下就好了。

我:OK,new好了,放入冰箱。

C#:好的,已經放入,使用了冰箱的拓展方法addElephant&<&>()方法。

我:嗯,你表現得很好,能不能放的稍微快點兒,剛剛C++放的就很快。

C#:為了您的安全,不能。

我:額。。。那我想調節一下大象耳朵的尺寸。

C#:對不起,不能調節。您可以設定大象的耳朵形狀,已為您定義好多種耳朵形狀,您還可以調整大象的膚色,已為您定義好多種膚色。

我:算了不調了,就這樣吧。

C#:好的。如果您需要速度,或者需要對大象的每個細節進行把握,還可以去看看我的弟弟,C++/CLR,他可以完成您提出的這些功能。您也可以將他帶到我這裡來,我們可以一起工作的。你也可以把C++完成的工作導出到二進位形式,我可以直接使用的。

我:好的謝謝,不用了。

C#:好的,祝您生活愉快。


Python:

我:我想把大象放到冰箱里。

Python:好的,import這個「把大象放入冰箱」模塊,然後使用run方法即可。

我:OK謝啦。

Python:不用。


在遙遠的地方,有三位大魔法師,吸引了許多學徒。

第一位大魔法師叫C,他是這樣教學生的。

"火球術:"

"首先,把提前寫好的符咒放在桌子上。"

"然後,把左手抬起來。"

"把右手抬起來。"

"讓左手的位置下移3厘米。"

………

………

………

省略大約100行。

雖然這位魔法師的方法很麻煩。但是很快就能召喚出火球,同時以後重複這個步驟就可以召喚出火球。

第二位大魔法師叫C++,是C的徒弟。

他的火球術則是這樣的。

"首先,用100個小時製作一張封裝的,美觀的,有注釋的符咒,然後專門寫一篇文檔描述它的外表。"

"然後在上面寫上火球術三個字。"

"扔出去。"

這位大魔法師的火球術使用很方便,只不過製作過程過於繁瑣,並且有的時候可能會過十分鐘才出現火球。

第三位大魔法師叫C#,據說是C和另一位姓J的大魔法師的不清不楚的產物。

他的火球術很簡單,只要喊一聲 火球! 就可以了。

只不過有一個致命的缺點。

如果離他的距離超過了5米,那所有的法術都會失效並且出現一大堆紅色的寫著error的神秘符咒,據說那是異次元的魔鬼的產物。


1.用指針最好

2.最好不用指針

3.什麼是指針?


C與C++的區別就是裸奔與穿著皇帝的新衣裸奔。C#完全是另外一種東西。


在群里見過不同的寫法:

C++: C艹

C# : C艹艹


「師父寫下:時,空,皆無法改變,而時空卻可以改變。這很難理解。我的早期理解是一個逗號可以改變一切,師父說:不,你仔細看。我說,上句和下句就有一個逗號之差別。師父說,你只看到表面,你仔細看,差別不只一個逗號。從日落到日出,我將手上捧的倆字看到快不認識了,師父將我叫入房中說:你看出差別了嗎?我說,我只看出一個逗號的差別。師父說,你已離答案很近,但是離答案越近,便越容易找不到答案。我跪在地上請求師父參破。師父說,看,其實是兩個逗號。」

————長安亂


爺爺,兒子,孫子的關係,一代不如一代,一代又盛過一代,爸爸和爺爺親得狠一些,爺爺和孫子不太親,爸爸和兒子親得狠一些


C就像一台引擎裸露在外,輪子變速箱剎車傳動軸承都要自己裝的「車」,如果你是DIY狂人喜歡自己造車,你會喜歡C的;

C++就像上面說的DIY狂人造出來的一台馬力十足的跑車,包含了C的全部優點外加一個外殼。開起來是瘋狂的野獸馬力十足,但是不是誰都能駕馭了,稍有不慎就會車毀人亡;

C#就像一台綜合性能非常好的轎跑,自動超速箱ABS防抱死空調音響一應俱全。讓你輕鬆上路,怎麼開怎麼爽。但是你永遠體會不到飆車的激情了,而且這車只能在特定公路開哦~


c++和c#有對象,c沒對象,最大的區別你們竟然沒發現哦。


c的出現最早,實現也最簡單,有很多和硬體關係非常緊密的特性,比如指針真的就是指內存地址,寫C的時候很明顯感覺到機器的重要性。

C++以C為基礎,最重要的當然就是面向對象了,C with class可不是白叫的,當然,因為C++他爹的堅持,c++幾乎支持所有的範式,就是寫法有很多,所以學起來點很多。

C#沒用過,基本上和java相似,更加面向程序員,和底層硬體離得更遠了。


理論上來說這三種學到頂尖都是可以做出任何軟體的。但是對於初學者的能力來說,c只能做數學題,c++能做個計算器,c#能做個小遊戲。而且這三種語言只有在一線的北上廣深才好找工作。

想在全國都方便找工作還是得java和php啊~


面向對象編程和面向過程編程的區別


我只知道他們語言標準不一樣


C語言面相過程 通過函數方法

C++ 把一件事情分開 用類來表達

C# 我覺得是把類更高的提煉 不像C++那樣需要封裝 很多都是已經有的類


C#怎麼說呢…個人不喜歡,從未使用過

工作後,寫過純C,後來公司要求寫了一段時間php,框架是Thinkphp。

然後又寫了基於嵌入式Linux的Qt開發,語言是C++,

再然後,又學了JAVA,把JAVA web開發學了一遍,

然後搞起了Android,各種開源項目

期間對微信公眾號又做了開發,

對了,還有Oracle,各種被腳本過程整死……

總結一下,一路在折騰,從未止步過

不要偏執於使用那種語言,而在於在學習一門語言的時候,領悟它與之前語言之間的區別和精髓,

下面是我買過的書

問:那為啥不學習C#?

答:因為我心裡有一個耿


C語言就像一把鋒利的隨身匕首,非常靈活,在高手的手上可以幻化出各種招式,殺人於無形。

C++像一門大炮,扛在肩上很重,炮彈打出去威力很大,但不太好瞄準,轉動也不靈活。不會操作的菜鳥用起來還容易炸膛。

C sharp像一門高度自動化的機槍,你只管扣板機就行了,機槍會自動瞄準、自動上子彈,所以也是三門語言中最容易上手的。


c:咸乾麵包。

c++:泔水。

c#:微軟出品的地溝油。


推薦閱讀:

如何評價 Christopher Kohlhoff 實驗性的 C++ Network 標準庫 ?
C++ 怎麼生成 4096 個函數?
C 與 C++ 的真正區別在哪裡?
如何評價 Visual C++ 將整合 Clang 用於開發 Windows 程序?
編譯 C++ 項目時模板引發的「undefined reference to」問題?

TAG:C編程語言 | C |