文章轉(zhuǎn)載自公眾號:CodeSheep,作者h(yuǎn)ansonwong99
最近收到讀者讀者小伙伴所提的問題,我順手截了兩個圖。
![學(xué)C語言和學(xué)C++它有毛關(guān)系嗎?](https://atts.w3cschool.cn/attachments/image/20200908/1599552030227080.jpg "學(xué)C語言和學(xué)C++它有毛關(guān)系嗎?")
![學(xué)C語言和學(xué)C++它有毛關(guān)系嗎?](https://atts.w3cschool.cn/attachments/image/20200908/1599552040346188.jpg "學(xué)C語言和學(xué)C++它有毛關(guān)系嗎?")
實不相瞞,這類問題之前也經(jīng)??吹?,但是我忘了截圖了。
每次遇到這種問題,看起來很簡單,但是打字一時半會還真說不清,想想今天周末了,寫一篇文章來統(tǒng)一聊聊吧,如果小伙伴們有不同看法,也歡迎批評指正。
C
和C++
到底是什么關(guān)系?
首先 C++ 和 C 語言本來就是兩種不同的編程語言,但 C++ 確實是對 C 語言的擴充和延伸,并且對 C 語言提供后向兼容的能力。對于有些人說的 C++ 完全就包含了 C 語言的說法還是有點別扭的。
C++ 一開始被本賈尼·斯特勞斯特盧普(Bjarne Stroustrup)發(fā)明時,起初被稱為“C with Classes”
,即「帶類的C
」。很明顯它是在 C 語言的基礎(chǔ)上擴充了類class等面向?qū)ο蟮奶匦院蜋C制。但是后來經(jīng)過一步步修訂和很多次演變(如下圖所示),最終才形成了現(xiàn)如今這個支持一系列重大特性的龐大編程語言。
![學(xué)C語言和學(xué)C++它有毛關(guān)系嗎?](https://atts.w3cschool.cn/attachments/image/20200908/1599552289173144.png "學(xué)C語言和學(xué)C++它有毛關(guān)系嗎?")
就像經(jīng)典書籍《Effective C++》一開頭就說的,現(xiàn)如今我們提到 C++ ,都應(yīng)該視其為一個龐大的「語言聯(lián)邦」,最起碼包含如下幾個重要的組成部分:
- 面向過程編程
- 面向?qū)ο缶幊?/strong>
- 泛型編程
- 元編程
- 函數(shù)式編程
- STL標(biāo)準(zhǔn)庫
這其中的第一部分「面向過程編程」,正是C++
提供的向后兼容C
語言的部分,所以你能看到市面上在售的大部分講C++
編程的書,一開始前幾個章節(jié)基本都是在講「面向過程編程」的內(nèi)容,包括但不限于:數(shù)據(jù)類型、變量、運算符、表達(dá)式、語句、判斷、循環(huán)、函數(shù)、指針等等這些內(nèi)容。
不學(xué)C
語言能直接學(xué)C++
嗎?
還是像前面所說,C++
編程語言的第一大重要組成部分就是「面向過程編程」,而這正是C
語言老大哥的領(lǐng)域。即使沒有學(xué)過C語言,一上來就直接學(xué)習(xí)C++
的小伙伴,應(yīng)該也難逃『面向過程』這一部分的內(nèi)容。因為市面上在售的大部分講C++
編程的書,開始的章節(jié)都在講「面向過程編程」的內(nèi)容。
從理論上來說,學(xué)C++
前并不一定非得學(xué)C
語言,但是有C
語言底子再去學(xué)C++
往往更具優(yōu)勢,最起碼「面向過程編程」這一部分內(nèi)容能夠輕車熟路。
但是遺憾的是,即使是《C++ Primer》這種700
多頁厚的權(quán)威C++
書籍,開頭也只有很少一部分在講「面向過程編程」,所以對于面向過程這一部分的講述是肯定沒有專門講C
語言的書籍剖析得細(xì)致和全面的,不然也不會有側(cè)重講指針相關(guān)的《C和指針》等這類書籍的出現(xiàn)了。
所以個人建議是在學(xué)C++
之前,C
語言的基礎(chǔ)還是盡量要夯實,肯定是有幫助的。
C
學(xué)得好的,學(xué)C++
是否更具優(yōu)勢?
是的。
最起碼學(xué)C++
時,里面的「面向過程」這一部分內(nèi)容可以說輕車熟路了。
C++
能替代C
語言嗎?
既然C++
這么強大,包含這么多模塊和范式,而且也幾乎包含了C
語言面向過程這一部分的內(nèi)容,那為啥還要學(xué)C
語言呢?都直接學(xué)習(xí)C++
它不香嘛?
是的,C++
很強大沒錯,但那些強大的范式和機制本身帶來的包袱就不輕,也確實給學(xué)習(xí)者造成了不小的負(fù)擔(dān),甚至勸退了很多人。
而反觀C
語言,C
語言本身就是一個把能力、性能、效率和學(xué)習(xí)成本權(quán)衡得非常極致的一種編程語言,以至于大學(xué)階段必開的程序設(shè)計課程里基本都有C
語言的身影。
而且C
語言的應(yīng)用領(lǐng)域極度廣泛,上到操作系統(tǒng)底層的原生接口,下到普通的應(yīng)用層開發(fā),C
語言都有著不小的功勞。以至于這么多年來,在Tiobe
編程語言排行榜里,C
語言都是居高位不下。
![學(xué)C語言和學(xué)C++它有毛關(guān)系嗎?](https://atts.w3cschool.cn/attachments/image/20200908/1599552461192432.png "學(xué)C語言和學(xué)C++它有毛關(guān)系嗎?")
而且2020
開年C語言重回巔峰王座,一舉奪得「2019
年度編程語言」。雖然這只是一個看起來很無聊的排名,但多多少少能說明一些事情。
![學(xué)C語言和學(xué)C++它有毛關(guān)系嗎?](https://atts.w3cschool.cn/attachments/image/20200908/1599552484498456.png "學(xué)C語言和學(xué)C++它有毛關(guān)系嗎?")
所以無論是過去,現(xiàn)在,甚至是未來,近50
歲的C
語言老將軍依然永不為奴。
只有C++
這種面向?qū)ο蟮恼Z言才適合大型項目嗎?
C++
的出現(xiàn)的確是為了更方便地開發(fā)大型應(yīng)用程序,畢竟面向?qū)ο缶幊汤锏暮芏嘀匾枷牒蜋C制都對大型項目和復(fù)雜系統(tǒng)所要求的項目工程化、代碼復(fù)用性/擴展性/可維護性等提供了強大的支撐。
但是擺在眼前的事實告訴我們,即便是C
語言,也照樣可以構(gòu)建出極其復(fù)雜的系統(tǒng)和軟件。上到Linux
這種曠世偉大的操作系統(tǒng)內(nèi)核,小到被各個公司重度依賴的Redis
、Nginx
等開源軟件或框架,都是C
語言的代表作品。
所以有時候我們不得不承認(rèn)的是,大家所說的抽象能力更多的是看寫這個程序的人,而并非編程語言本身。
小 結(jié)
好啦,扯得有點多了,總結(jié)一下就是:
- C 語言和 C++ 是兩個不同的編程語言,只不過內(nèi)容上有一定的重疊;
- C 語言是一門很強大的編程語言,我覺得有機會還是要學(xué)一下;
- 一般來說,有了 C 語言的基礎(chǔ),上手 C++ 也會更快;
- C++ 和C 各有各的選用考慮和應(yīng)用場景,并沒有誰更好一說,學(xué)不學(xué)看自己的興趣和自身技術(shù)發(fā)展的考量
以上就是W3Cschool編程獅
關(guān)于學(xué)C語言和學(xué)C++它有毛關(guān)系嗎?的相關(guān)介紹了,希望對大家有所幫助。