tft每日頭條

 > 生活

 > 怎麼學好c語言程序設計

怎麼學好c語言程序設計

生活 更新时间:2024-06-18 20:35:26
引言

知乎上關于“C 難學”的話題,有個高贊回答,說用了十年C ,隻敢說“我有一定的C 基礎”。這内容雖然是戲谑C 難學,但其實也道出了不少程序員的心聲。

怎麼學好c語言程序設計(C真的很難學好大師告訴你程序設計要怎麼做)1

C 為什麼會被認為是一門很難學好的語言?

對于初學者來說,總想把C 的特性都學會了,再去解決問題。那麼就會發現,這門語言的特性不僅繁雜,而且标準還總在更新。

不僅如此,它支持的編程範型還多,包括過程式、面向對象式、函數式、泛型、模闆元。一個問題能有N種解法,到底用哪種呢?

我在早期的一個C 項目中,出于強烈的探索心,既炫技式的使用一些特性,還混合了多種編程範型,導緻後來工作交接時困難重重。我本來想為問題找到最好答案,結果解決辦法本身卻成了問題。

C 之父 Bjarne Stroustrup 當初在設計這門語言時,一個核心哲學就是将更多的自由交給程序員。所以這也就 C 中包含了諸多特性,又支持多種編程範型的原因。

怎麼學好c語言程序設計(C真的很難學好大師告訴你程序設計要怎麼做)2

Bjarne Stroustrup

因此,用好 C 的前提是程序員對要解決的問題,有足夠清楚的認識,從而将語言的威力發揮出來。

那麼,C 要怎麼學,怎麼用?

在《C 沉思錄》這本書中,可以找到答案。

看到重要之處

《C 沉思錄》的兩位作者 Andrew Koeing 與 Barbara Moo 可謂程序員界的神仙俠侶。Andrew 大神早在1977年就加入貝爾實驗室,在那裡他開始了對 C/C 語言的研究。Barbara 于1983年進入貝爾實驗室,也緻力于對 C 的研究與應用。

怎麼學好c語言程序設計(C真的很難學好大師告訴你程序設計要怎麼做)3

Andrew Koeing

夫妻倆平常除了研究編程語言,還将自己的思考寫下來,形成一系列的技術文章發表。這些文章在業界獲得了廣泛的好評,于是 Andrew 大神夫妻從中精挑細選,就有了這本經典的《C 沉思錄》。

怎麼學好c語言程序設計(C真的很難學好大師告訴你程序設計要怎麼做)4

Barbara Moo

我想對近幾年成長起來的新生代 C 程序員們做出一些閱讀提示。本書寫作年代早于 C 11标準公布之前,而已經習慣了 Morden C 語法的程序員初看此書時可能會有疑問,為什麼要看一本連 C 11 特性都完全不涉及的書?

答案有兩個。

首先,就是 Andrew 大神所強調的,優秀的程序員并不是掌握了最多語言特性的,而是能夠出色解決問題的。所以這本書将程序設計放在第一位,C 次之。

其次,Andrew 大神不僅是 Bjarne Stroustrup 的鐵哥們,還是 ANSI C 标準委員會的項目編輯。因此他在 C 的發展上有着舉足輕重的作用,我們現在使用到的諸多新特性,都能在這本書中找到思考的雛形。

所以,我們在看這本書時,不必拘泥于語言層面的時效性,而要将注意力放在大神解決問題的思維方式上。跟随 Andrew 大神從理解問題出發,走過程序設計的探索之路,最終找到解答。

C 可以做好,而C做不好的

在序幕中,Andrew 大神就遇到一位同事問:“你能說服我去學習C ,而不是 C 嗎?”

由此,Andrew 大神進一步思考:有什麼事情是 C 可以做好,而 C 卻做不好的?

他選擇從面向對象編程這個方向切入,于是設計了一個簡單的跟蹤消息輸出類。它展示了類的公有方法、私有屬性的封裝特性,并且讨論了在變更功能時,C 的解決辦法要更加簡單優雅,而 C 則要關注太多的細節。

對面向對象編程的支持,是 C 最基本的核心功能點。Andrew 大神認為對于問題的思考,要建立在足夠抽象的層面上,而不是眉毛胡子一把抓。而類就是 C 的核心概念。

怎麼學好c語言程序設計(C真的很難學好大師告訴你程序設計要怎麼做)5

Andrew 大神用開車來打比方,如果司機要關注發動機、變速箱、傳動裝置是怎麼工作的,那他上路就得出車禍。此例即說明,程序員要做的是抓住問題的本質,并且為本質定義一個類,最後是确保這個類能夠獨立的工作。

如果要解決的問題很複雜,那就對問題進行拆分,保證一個類隻解決一個具體的問題。以繼承的方式,将類之間的關系組織起來;再以動态綁定的方法,來實現具體的處理邏輯;對象間以通信的方式,實現數據交換。這就是面向對象設計的一般性原則。

而對于一個類應該怎麼設計,Andrew 大神提出了一個類設計者的核查表。這無論是對于新手還是老鳥,都十分有借鑒意義,因此我将其整理引用如下:

1. 你的類需要一個構造函數嗎? 2. 你的數據成員是私有的嗎? 3. 你的類需要一個無參的構造函數嗎? 4. 是不是每個構造函數初始化所有的數據成員? 5. 類需要析構函數嗎? 6. 類需要一個虛析構函數嗎? 7. 你的類需要複制構造函數嗎? 8. 你的類需要一個賦值操作符嗎? 9. 你的賦值操作符能正确地将對象賦給對象本身嗎? 10. 你的類需要定義關系操作符嗎? 11. 删除數組時你記住用 delete [] 了嗎? 12. 記得在複制構造函數和賦值操作符的參數類型中加上 const 了嗎? 13. 如果函數有引用參數,它們應該是 const 引用嗎? 14. 記得适當地聲明成員函數為 const 了嗎?

模闆、泛型編程與 STL

C 在 Bjarne Stroustrup 手中誕生時,這門語言就一直受到 Andrew 大神的重點關注。從早期的面向對象編程理念開始,Andrew 大神就在思考應該賦予 C 哪些新特性。

在《C 沉思錄》中,關于模闆與泛型編程的讨論相當經典。這其實就是Andrew 大神揭示了他對于模闆及其應用的的思考脈絡,在他的引領下,我們從容器類的設計讨論開始,逐漸領悟泛型編程的精妙之處。

模闆的本質是受限的語法宏,但它比普通宏要更加安全,且編譯後的運行速度幾乎與宏一樣快,這對于強調性能的 C 程序員來說,是非常重要的。

怎麼學好c語言程序設計(C真的很難學好大師告訴你程序設計要怎麼做)6

1990年,模闆(Template)被納入 C 标準之中,這便是 Andrew 大神在持續研究之後,做出積極推動的結果。模闆這一特性可謂打開了 C 新的局面,它所支持的泛型編程使得參數類型抽象化,程序員隻需要編寫與程序相關的細節就好。

泛型編程結出最豐碩的果實,就是 STL (Standard Template Library, 标準模闆庫)。STL 是 Alexander Stepanov 在惠普 Palo Alto 實驗室時開發的算法庫,1993年時被 Andrew 大神慧眼相中,并積極向 ANSI/ISO C 标準委員會推介。

怎麼學好c語言程序設計(C真的很難學好大師告訴你程序設計要怎麼做)7

Alexander Stepanov

最終在1994年,STL 納入 C 标準之中,成為之後程序員們的福音。因為大家不用像 C 語言那樣,在基礎數據結構上重複地造輪子。STL 提供的各種容器類與諸如檢索、排序的高效算法,讓程序員得以将精力放在業務邏輯的實現上,可以說是極大地解放了生産力。

同樣在書中,Andrew 大神對 STL 的主要組件的實現原理,分别以淺顯的示例作了讨論,包括container(容器),algorithm(算法),iterator(疊代器),adapter(适配器),function object(函數對象)。

怎麼學好c語言程序設計(C真的很難學好大師告訴你程序設計要怎麼做)8

這使得我們對 STL 的實現有了直觀的認識,相信我們再去鑽研 STL 時,就能得其門而入。另一方面,無論是應用 STL,還是通過泛型編程擴充自己的功能庫,都可以做到得心應手了。

庫與語言特性

Andrew 大神對程序庫的态度還是很鮮明的,就是沒事不要去重複發明輪子。STL 就是他踐行這一理念的最好證明。

在書中,他就以解析一段文本為例,通過使用庫提供的變長字符串、鍊表、關聯數組、正規表達式等功能,兩小時搞定。如果所有基本功能都要從頭開發,那将增加多少工作量。

所以,Andrew 大神的“實用主義”精神,是他解決問題的基本原則,即盡量複用已有的成果,凡是具備通用功能的代碼,都可以考慮封裝為獨立的庫。

怎麼學好c語言程序設計(C真的很難學好大師告訴你程序設計要怎麼做)9

在 C 發展過程中,也曾有過争論,即是在語言内增加更多新特性來擴充功能,還是通過程序庫來達到目标。最終 C 選擇了後者,這和 Andrew 大神的積極影響也是分不開的。

C 内置的容器類型也就是數組和結構體,其它諸如vector, list, stack, set, map等都是通過 STL 庫來擴展的。這個核心理念,就是語言特性可以通過庫來擴充。

這無疑給了編程語言極大的靈活性,新特性可以放在庫中進行試驗,疊代成熟之後即可以被吸收為标準。而且也給廣大開發者提供了參與語言發展的機會,這也是 C 以其無與倫比的開放性,而深受程序員們喜愛的原因。

怎麼學好c語言程序設計(C真的很難學好大師告訴你程序設計要怎麼做)10

Andrew 大神也對庫設計給出了建議,他認為對待庫設計要像語言設計一樣。他以設計一個字符串類為例,提醒我們内存檢測、數據複制、隐藏實現等各個方面存在的坑,以及要注意的地方。

也就是說,這并不是一件容易的事,程序員需要将判斷力、技巧和品位結合起來使用,才有可能将庫設計好。

結語

這本書的的英文名是《Ruminations on C 》,ruminations 這個詞其實是很有分量的,其釋義有沉思、反刍。意味着讀這本書不是簡單地過一遍就好,而是需要不斷地重溫,結合工作中的實踐進行反思。

所以《C 沉思錄》可能更适合有一定工作經驗的程序員,也就是學會了不少語言特性,但是在工作中一施展就覺得特迷惘的時期。

這時候翻開這本書,一定會有很深的感觸,會發現能解決問題就好,沒必要搞得太晦澀;還有設計是不是過度了,那就“實用主義”簡化一下吧。不說别人,起碼我自己就是經曆了這個過程。

最後,對問題:“如何成為更好的 C 程序員?”,Andrew 大神夫婦給出了三條他們認為最重要的建議:

  1. 避免使用指針;
  2. 提倡使用程序庫;
  3. 使用類來表示概念。

怎麼學好c語言程序設計(C真的很難學好大師告訴你程序設計要怎麼做)11

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved