亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現在的位置是:首頁 > 技術閱讀 >  為什么我十分喜歡C,卻很不喜歡C++?

為什么我十分喜歡C,卻很不喜歡C++?

時間:2024-02-11
作者 | Kostya Shishkov       
譯者 | 彎月      責編 | 歐陽姝黎
出品 | CSDN(ID:CSDNnews)

C和C++孰優孰劣之爭貌似永遠不會有結果,我們也就看看熱鬧吧:

雖然 C 語言并不是我所學的第一門語言,也不是我的最后一門語言,但是我仍然非常喜歡 C,當需要寫程序時,我的第一選擇還是 C。同時,我也會關注現代編程語言及其發展趨勢,而且我還使用 Rust 編寫了自己的業務愛好項目。那么,為什么我沒有拋棄 C 而選擇其他語言呢?我對于 C++的看法又是如何的呢?


為什么說C不是最好的語言?


首先,這個世上沒有最好的編程語言。每種語言都有獨特的優勢以及適用情況,所以盡管你可以在 Excel 中編寫光線追蹤程序,但最好還是使用其他語言。因此,我們都需要了解編程語言的限制,不要抱怨 Web 服務器不是用 Fortran 編寫的,也不要抱怨基本沒有任何應用使用 Perl 或 C++作為內部腳本語言。我認為 C 語言不太理想的方面包括以下幾點(除了 C 比較老,發展不快之外,當然還與個人的喜好有關)。

其次,有些時候,C 的語言不夠明確。比如,*可以是二進制乘法運算符、一元解引用運算符,也可用于聲明指針。

再者,有些情況不夠安全,例如越界訪問數組這種極其常見的錯誤都沒有運行時檢查,這一點連 Borland Pascal 都比不了,更不用說更現代的編程語言了(盡管你會為了提高性能關閉這個編譯選項)。此外,指針讓我們很難保持一切井然有序。再加上一些其他情況,比如調用函數不需要事先聲明原型,這樣很容易將錯誤類型的參數傳遞給函數。

最后,C 的標準庫非常有限。有些編程語言甚至擁有開箱即用的 Web 服務器(或者至少有構建 Web 服務器所需的所有模塊),但 C 標準庫甚至連 Web 服務器的容器也沒有。


為什么我還是喜歡C?


盡管如此,我還是十分喜歡 C,因為它是一種簡單的語言。從某種意義上說很簡單,很容易表達自己的想法以及期望。

舉個例子,假設兩個數組有兩個偏移量,其中一個可以為負數,如果使用C語言編寫,則可以寫成:

arr[off1 + off2]

如果是Rust,則需要寫成:

arr[((off1 as isize) + off2) as usize]

通常,C 的循環也比 Rust 的迭代器組合更為簡潔(當然 Rust 也允許使用前一種方式,但 linter 并不滿意,它會建議你使用迭代器來代替)。類似地,memset()和 memmove()也是功能十分強大的工具。

在大多數情況下,你都可以預見到編譯的結果,即對象在內存中的表示方式,以及如何通過不同的方式理解編譯后的結果(新版 C 標準中這一點變得更困難,這都要怪 C++,我稍后再詳細介紹)。另外,你也很清楚函數調用的結果等等。由于這個原因,C 被稱為可移植的匯編語言,所以我非常喜歡 C。

我們拿汽車做個類比,C 語言就像一輛跑車,擁有手動變速箱,可以提供最佳性能,但是如果你不熟悉離合器和掛擋操作,那么變速箱很容易被損壞,甚至可能損壞發動機,當然,油門踩得過大也有可能沖出馬路。然而,與自動變速箱相比,這種車輛的發動機能量更大,而且你可以預測性能,還可以炫車技,這些在其他車輛上都是不可能的。


這與C++有什么關系?

下面,我們來說一說 C++,其實我不討厭 C++。我不能否認,與 C 相比, C++ 擁有兩個優點:

  • 更好的程序結構:C++ 擁有命名空間和類,而且在某些方面Simula還是很出色的。

  • 擁有 RAII 概念:一個簡單的例子就是 C++ 擁有構造函數,可在創建對象時初始化對象;還擁有析構函數,在銷毀對象時,做一些清理的工作。這個概念進一步發展,就接近 Rust 的生命周期了。

另一方面,C++ 有兩個特征,我非常不喜歡。 

首先是這門語言的整體性質。其他編程語言擁有的流行功能最終都會進入 C++。因此,每過幾年,C++標準就會添加一些新功能。最終,這門語言就變得有點怪異,沒人能夠完全掌握,而且許多功能都是抄襲的其他語言。基本上每個人在編寫代碼的時候,都會選擇一個 C++的子集,然后忽略其他功能的存在。另外,我們究竟應該使用哪個 C++版本的功能,并沒有一套標準的方法。Rust 在包的范圍內提供了版本管理。據我所知,C++也曾嘗試過引入“代際”的概念來實現同樣的功能,但沒有成功。我經常聽到有人獨自編寫 C 編譯器,卻從來沒聽說過有人編寫 C++編譯器。

其次,實際上 C++不僅是多種語言,而且還是一種元語言(即模板)。我了解 C++的創建初衷,也同意它對于與類型無關的代碼的處理,比 C 預處理器更好。但實際上,它產生的代碼十分可怕,原本是“頭文件僅包含聲明,實現放在編譯好的代碼中”,變成了“頭文件包含所有項目會用到的代碼”。我不喜歡過于冗長的編譯時間,但這種方式只能讓情況更糟。

最后,我覺得 C++的出現反而給 C 帶來了約束以及不良影響。我不是在討論 C/C++,也不是指 C 與 C++的共通之處,我討論的是耦合對標準和編譯器都有不良影響。一方面,C++建立在 C 之上,從而得到了極大的發展;另一方面,如果 C++中沒有 C 遺留下來的大多數功能的話,情況可能會更好(當然,C++曾設法通過淘汰的方式逐步放棄某些 C 功能,但對于舊功能的支持仍然存在)。但是,C++ 24 能夠在 C++ 21 的基礎之上,發展成為一門獨立的編程語言嗎?大多數過時的功能都可以拋棄嗎?我對此表示懷疑。

C++編譯器對C的影響 

實際上,C 語言被當成了沒有某些功能的 C++。比如微軟的 C 編譯器直到2015 版才開始支持 C99 功能(即便如此,它還是以 bug 修復 bug 的方式來支持兼容性,因為客戶可能會震驚地發現可變參數宏居然可以運行)。但是,無論是標準的編譯器還是其他編譯器中都可以看到相同的方法,這些都是相關的問題。 

主要問題在于,C 和 C++標準都是根據編譯器開發人員的反饋而編寫的,而且大多數都是 C++開發人員(有些人對現實世界編程一無所知,而且他們還認為現實世界的做法與自己的觀點完全吻合,真是令人窒息的操作)。雖然我也沒有遵循標準的開發程序,但是我很確定 C99 及其后版本中令人討厭的諸多功能皆來自那些編譯器開發人員。他們只從 C++的角度出發考慮,而且還將這些功能強加給了 C,還美其名曰簡化編譯器。

當然我指的是“未定義的行為”以及編譯器的處理方式。這已成為一大毒瘤(只要你的代碼依賴于二進制補碼算術,就會被認定具有未定義的行為,編譯器會拋棄整塊代碼)。

在我看來,以下四種行為盡管不值得提倡,但前兩個也并非不可接受:

  • 依賴于體系結構的行為(即依賴于 CPU 體系結構的行為)。包括絕大部分算術運算。例如,如果我知道目標及其使用了兩個協處理器,為什么編譯器會選擇另一種方式,僅僅是為了獲得理論上的優化?同樣的問題也適用于移位運算。如果我知道 x86 會忽略移位偏移量的高比特,在 ARM 上負的左移相當于右移,那么為什么不能專門針對該體系結構編寫程序呢?畢竟,連整數的大小在不同平臺上都不一樣。這種不可移植性只需警告就好,讓用戶自行處理。

  • 指針魔法和類型雙關。這似乎又是編譯器優化帶來的限制。我同意,在重疊的內存區域上使用 memcpy(),不同的實現可能會給出不同的行為(現代的 x86 實現會從區域尾部開始復制),而且還依賴于地址的相對位置,但其他的規則就沒什么道理了。例如,無法使用兩個不同類型的指針同時操作同一塊內存區域。我無法想象為什么這種行為被禁止,其原因只可能是編譯器優化。這樣就不可能利用聯合體將整數轉換成浮點數。Linus 也曾吐槽過這一點,我就不用重復了。但在我看來,這樣做的目的或者是更好的編譯器優化,或者是出于 C++的要求(由于類型跟蹤的要求)。

  • 實現中定義的行為(即超出 C 標準規定的行為)。我常用的例子就是函數調用:根據調用的習慣約定和編譯器的實現,函數的參數的求值順序可能完全是隨機的,因此 foo(*ptr++, *ptr++, *ptr++)的結果是未定義的,因此即使你知道目標體系結構,也不應該依賴于這種行為。

  • 完全未定義的行為。最常見的例子就是在一條語句中改變變量狀態,例如著名的 I++ + i++,或者更甚的 *ptr++ = *ptr++ +*ptr++。

由于 C++比 C 更高級(盡管它由許多來自 C 的特性,但都不建議使用,應該使用 reinterpret_cast<>代替類型轉換,用引用代替指針,等等),所以不要期待 C++程序員能夠像 C 程序員那樣理解底層代碼。當然,由于 C++程序員占絕大多數,C/C++的耦合也極其常見,所以 C 編譯器通常會進行擴展以支持C++,并使用 C++重寫,以適應其復雜度。所以很不幸,你不得不使用 C++編譯器來編譯 C 編譯器(還好我們還有 LCC、PCC 和 TCC 等純 C 編譯器)。

總結 

總的來說,我喜歡C所處的中層位置,它既可以完成一些底層的實現,例如輕松地操作內存,同時又可以享受高級語言的好處。另一方面,我對C++強烈的不滿來自其在設計上的選擇,而且這些設計影響了C標準和編譯器。

至少我不可能用 C90 特別版取代 C90,并假裝原來的版本不存在。

原文鏈接:https://codecs.multimedia.cx/2021/05/why-i-still-like-c-and-strongly-dislike-cpp/

累夠嗆!整理了一份C++學習路線圖!



如何設計結構體


高端知識點:折疊表達式(我也是第一次知道)


推薦學習這個C++開源項目


亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美国十次成人| 老司机精品视频网站| 亚洲欧美激情四射在线日 | 久久精品卡一| 狠狠88综合久久久久综合网| 久久精品国产77777蜜臀| 一区二区三区在线免费观看| 久久婷婷久久| 亚洲精品黄色| 欧美午夜精品一区| 欧美亚洲综合网| 亚洲在线观看免费| 国产自产v一区二区三区c| 久久国产精品第一页| 亚洲国产精品va在线看黑人动漫 | 国产精品午夜国产小视频| 午夜久久99| 亚洲丰满在线| 国产精品一二三视频| 欧美不卡高清| 欧美亚洲视频在线观看| 亚洲日本精品国产第一区| 国产精品女人网站| 欧美mv日韩mv国产网站| 欧美在线免费播放| 一区二区欧美亚洲| 影音先锋在线一区| 国产亚洲a∨片在线观看| 欧美精品三区| 欧美v国产在线一区二区三区| 亚洲一区二区在线免费观看视频 | 亚洲一区二区三区久久| 亚洲第一页中文字幕| 韩日精品在线| 国内精品久久久久伊人av| 国产精品久久久久久久浪潮网站| 久久亚洲图片| 久久久精品视频成人| 久久精品亚洲国产奇米99| 欧美一级视频| 久久精品免费电影| 久久婷婷麻豆| 亚洲一区视频| 国产亚洲欧洲一区高清在线观看| 欧美精选在线| 国产精品久久久久久久久久久久久 | 羞羞答答国产精品www一本| 中文高清一区| 亚洲欧美日韩精品综合在线观看 | 亚洲综合色自拍一区| 亚洲欧美日韩国产综合| 欧美一区二区在线观看| 久久精品国产99国产精品| 久久人人97超碰国产公开结果| 久久美女性网| 欧美日本在线播放| 国产精品久久久久91| 国产一区日韩一区| 亚洲人成高清| 欧美一级久久| 欧美日韩国产不卡在线看| 国产精品青草综合久久久久99| 国产欧美在线观看一区| 亚洲欧洲在线观看| 欧美伊人久久久久久午夜久久久久| 久久久亚洲高清| 国产精品久久999| 亚洲人成网站影音先锋播放| 欧美一区激情视频在线观看| 欧美国产精品v| 狠狠色丁香婷婷综合久久片| 99热在这里有精品免费| 久久亚洲综合色| 国产日韩精品一区二区浪潮av| 亚洲国产精品久久久久秋霞影院 | 欧美日韩精品是欧美日韩精品| 国产精品日韩一区二区| 伊人婷婷久久| 久久福利一区| 欧美午夜精品理论片a级按摩| 亚洲激情视频网| 乱码第一页成人| 亚洲国产欧美日韩精品| 久久精品国产99精品国产亚洲性色| 欧美日韩爆操| 一区二区激情视频| 欧美激情视频一区二区三区在线播放| 国产一区亚洲| 麻豆精品视频在线观看| 亚洲国产精品一区在线观看不卡| 欧美中在线观看| 黑人操亚洲美女惩罚| 久久久999| 亚洲高清av在线| 欧美日韩精品一二三区| 亚洲在线第一页| 韩日在线一区| 欧美日韩另类丝袜其他| 91久久久精品| 国产精品乱码一区二三区小蝌蚪| 国产精品美女久久久久久久 | 亚洲一区二区免费| 国产精品久久久久久亚洲调教| 午夜在线观看免费一区| 在线看成人片| 国产精品免费在线| 久久性色av| 亚洲综合色噜噜狠狠| 91久久精品一区二区三区| 国产精品video| 欧美极品一区| 亚洲成人资源| 欧美福利视频一区| 小处雏高清一区二区三区| 亚洲国产精品第一区二区| 国产精品欧美日韩| 欧美高清视频一区二区三区在线观看| 亚洲欧美精品在线观看| 亚洲国产精品成人一区二区| 欧美三级在线播放| 欧美国产日韩在线观看| 久热精品视频在线观看| 新狼窝色av性久久久久久| 日韩午夜电影av| 最近看过的日韩成人| 亚洲国产婷婷| 亚洲国产日韩一级| 1204国产成人精品视频| 激情久久久久久久| 国产又爽又黄的激情精品视频| 国产精品免费一区二区三区在线观看| 欧美精品aa| 欧美三日本三级少妇三99| 国产精品大片免费观看| 欧美婷婷在线| 国产乱子伦一区二区三区国色天香| 国产精品扒开腿做爽爽爽软件| 欧美性猛交xxxx免费看久久久| 欧美日韩精品伦理作品在线免费观看| 欧美激情1区2区| 国产精品白丝jk黑袜喷水| 国产精品视频福利| 精品成人a区在线观看| 亚洲国产一区二区在线| 亚洲美女区一区| 亚洲欧美国产不卡| 久久久久国色av免费看影院 | 欧美激情亚洲国产| 欧美日韩一二三区| 国产精品自在在线| 伊人久久大香线| 一本色道久久88亚洲综合88| 免费试看一区| 午夜一区在线| 久久精品日产第一区二区| 女仆av观看一区| 国产乱码精品| 一本色道久久99精品综合| 久久久午夜视频| 国产一区二区久久精品| 亚洲一区二区三区影院| 欧美国产一区二区三区激情无套| 国产嫩草一区二区三区在线观看 | 亚洲二区在线视频| 一区二区三区精品国产| 久久久久久9999| 国产麻豆日韩欧美久久| 一区二区高清视频| 蜜桃av综合| 1024日韩| 免费在线观看一区二区| 国产日韩一区二区三区在线| 一区二区三区欧美激情| 欧美福利一区二区| 亚洲精品国产精品乱码不99| 久久网站免费| 亚洲国产成人porn| 免费欧美在线| 亚洲精品国产精品国自产观看| 免费欧美在线| 99视频+国产日韩欧美| 欧美区一区二区三区| 日韩天堂在线观看| 欧美日韩一区二区在线| 亚洲无吗在线| 国产曰批免费观看久久久| 久久天堂国产精品| 亚洲黄页一区| 欧美午夜电影在线| 久久精品国产第一区二区三区| 红桃视频亚洲| 欧美人与性动交cc0o| 亚洲欧美成人一区二区三区| 国产一区二区三区四区老人| 免费亚洲电影在线观看| 一区二区成人精品| 黄色成人片子| 国产精品日韩精品| 毛片基地黄久久久久久天堂| 一区二区三区四区国产|