學(xué)習(xí)C ,常見(jiàn)的誤解
時(shí)間:2021-08-19 15:26:41
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]學(xué)習(xí)C你是否會(huì)有以下幾點(diǎn)誤解?1.“要理解C,你必須先學(xué)習(xí)C”?2.“C是一門(mén)面向?qū)ο蟮恼Z(yǔ)言”?3.“為了軟件可靠性,你需要垃圾回收”?4.“為了效率,你必須編寫(xiě)底層代碼”?5.“C只適用于大型、復(fù)雜的程序”?如果你中*了,說(shuō)明這篇文章適合你看。對(duì)某些人,某些任務(wù),在某些時(shí)間,其...
學(xué)習(xí)C 你是否會(huì)有以下幾點(diǎn)誤解?
1. “要理解C ,你必須先學(xué)習(xí)C”?2. “C 是一門(mén)面向?qū)ο蟮恼Z(yǔ)言”?3. “為了軟件可靠性,你需要垃圾回收”?4. “為了效率,你必須編寫(xiě)底層代碼”?5. “C 只適用于大型、復(fù)雜的程序”?如果你中*了,說(shuō)明這篇文章適合你看。對(duì)某些人,某些任務(wù),在某些時(shí)間,其中一些誤解曾經(jīng)只是正確的。然而,在如今的C ,應(yīng)用廣泛使用的最先進(jìn)的ISO C 2011編譯器和工具,它們只是誤解。?下面來(lái)一一解釋?誤解一:“要理解C ,你必須先學(xué)習(xí)C”?學(xué)習(xí)C 基礎(chǔ)編程比學(xué)習(xí)C要容易地多。?C幾乎是C 的一個(gè)子集,但是它不是最先要學(xué)習(xí)的最好的子集,因?yàn)镃缺少計(jì)數(shù)支持,類(lèi)型安全,和易用的標(biāo)準(zhǔn)庫(kù),而C 為簡(jiǎn)單任務(wù)提供了這些。?誤解二:“C 是一門(mén)面向?qū)ο蟮恼Z(yǔ)言”?C 支持OOP和其他編程風(fēng)格,但它并不局限于狹隘的“面向?qū)ο蟆?。它綜合地支持了包括面向?qū)ο蠛头盒途幊碳夹g(shù)。通常,一個(gè)問(wèn)題的最優(yōu)解決方案,包含不止一種風(fēng)格(范例)。“最優(yōu)”,我指的是最短、最易于理解、最有效率和最易于維護(hù)等。?“C 是一門(mén)面向?qū)ο蟮恼Z(yǔ)言”使人們認(rèn)為C 不是必要的(當(dāng)與C做比較時(shí)),除非你需要一個(gè)巨大的類(lèi)繼承層次以及很多須函數(shù)(運(yùn)行時(shí)多態(tài))——對(duì)很多人和很多問(wèn)題,這樣應(yīng)用并不合適。相信這個(gè)誤區(qū)導(dǎo)致C 因?yàn)椴皇羌兠嫦驅(qū)ο蠖獾阶l責(zé);畢竟,如果你把“好”和“面向?qū)ο蟆钡韧饋?lái),那么C 明顯包含了很多不是面向?qū)ο蟮臇|西,一定會(huì)被認(rèn)為是“不好”。不管是哪種情形,這個(gè)誤解為不學(xué)習(xí)C 提供了一個(gè)很好的借口?誤解三:“為了軟件可靠性,你需要垃圾回收”?在回收不再使用的內(nèi)存上,垃圾回收做的很好,但是并不完美。它并非靈丹妙藥。因?yàn)閮?nèi)存可以被間接地引用,并且很多資源并不是普通內(nèi)存。?誤解四:“為了效率,你必須編寫(xiě)底層代碼”?許多人相信高效率的代碼必須是底層代碼。一些人甚至認(rèn)為底層代碼天生就是高效的(“如果代碼很丑陋,那它一定很高效!一定有人花費(fèi)了大量時(shí)間和精力來(lái)優(yōu)化它!”)。當(dāng)然,你僅僅使用底層代碼是可以寫(xiě)出高效代碼的,并且有時(shí)在直接處理機(jī)器資源時(shí)必須使用底層代碼。?然而,你一定要衡量一下工作是否有價(jià)值:現(xiàn)代C 編譯器非常高效,而現(xiàn)代機(jī)器架構(gòu)非常復(fù)雜。如果必須使用底層代碼,一定要通過(guò)接口封裝起來(lái),以便于使用。通常,通過(guò)高層接口封裝底層代碼,會(huì)帶來(lái)更好的優(yōu)化(如,避免“濫用”底層代碼)。在關(guān)注效率的場(chǎng)合,首先嘗試用高層抽象來(lái)呈現(xiàn)需要的解決方案,而不要不加考慮地使用比特位和指針。?誤解五:“C 只適用于大型、復(fù)雜的程序”?C 是一個(gè)巨型的語(yǔ)言。它定義的大小和C#與Java差不多。但是這并不意味著你必須知道每一個(gè)細(xì)節(jié),或者在每一個(gè)程序中都用到所有特性。?接下來(lái)再說(shuō)一個(gè)C 非常經(jīng)典的易犯錯(cuò)的案例?錯(cuò)誤代碼:?12bool operator( )(const GUID