學會了 C 語言真的可以開發出很多東西嗎?

jopen 8年前發布 | 19K 次閱讀 Python

【導讀】:本文綜合整理自知乎的同名問答貼,題主還補充:

我現在C語言入門,基本靠自學,就看網上的那種教程,但是我怎么覺得它就是只能做下數學題,我覺得它并不能編輯出一個啥子游戲或者軟件出來噢……初學者,見諒。

下面是 濤吳 的 回答 分享。

學會了 C 語言真的可以開發出很多東西嗎?
馬里奧碰到花朵就變身。

什么是馬里奧?一個裝著 16 × 32 個小色塊的長方形,其中一些色塊填著顏色,另一些沒有。什么是花?一個 16 × 16 的正方形。什么是「變身」?把馬里奧這個方塊里面代表衣服的褐色變成紅色,代表背帶褲的紅色變成白色。什么是褐色?暫且說它是 0×887000 這個數字。什么是「碰到」?馬里奧的長方形與花朵的正方形有所重疊。什么是「重疊」?假設馬里奧的這個方塊占據屏幕(什么是屏幕?一個能裝下 256 × 240 個小色塊的矩形)中 X 方向 101 到 116、Y 方向 21 到 52 之間的區域,那么只要這個區域內有一點或更多點也被花朵所占據(比如花朵處在 X 116 到 131、Y 21 到 36 之間的區域內),我們就認為兩者有所重疊。

若給定以八個數值代表的兩個矩形區域,請寫出判斷兩個區域是否有重疊的 C 語言程序。如果你能寫出來,那么祝賀你,如果有朝一日你想自己做一遍 NES 版本的《超級馬里奧》,你至少知道讓他變身需要做什么了。

是的,C 語言也許「只能」做數學題。可是,絕大多數游戲的運行過程就是不停地做數學題,而所謂編寫游戲,也就是把游戲的規則和游戲的效果轉化為數學題而已。其中不少題目電腦都已經知道怎么解——是別的程序員事先告訴它的——比如「求一堆散落在三維直角座標系之中的多面體在 8(x?3)?10(y+1)?11(z?1)=0 這個平面上一個給定范圍內的投影」或者「給定一些彼此相連的頂點,求任意兩點之間的最短路徑」之類的數學題,它只需要千萬分之一秒就能給你解好。這種能力有什么用?電腦上 FPS 游戲的本質活動就是不停地求三維座標系下的多面體經過變換之后在二維平面上的投影,不停地判斷兩個多面體是否彼此重疊,以及不停地尋找兩個頂點之間的最短路徑,最終達到讓怪物沖到你面前咬你一口的目的。不止游戲如此,其他軟件也都差不多,每一個細節都是某種數學題——比如知乎頁面頂端的藍色導航條背景,就是 CSS 描述的一個淺藍到深藍的漸變——漸變是怎么回事呢?給出兩個數字分別代表兩種顏色,以及第三個數字代表一段距離,求一系列顏色的數值以及次序,使得這段距離中兩種相鄰顏色之間的變化最小。數學題。別說 C 語言,一切編程語言最終都只能做數學題,根據給定的數據,算出另一些數據,算出更多的數據,然后存貯、發送或者呈現算出的數據。

不過我能理解你的困惑。投入大量時間看完教程,結果只能在黑框里輸出一串數字。這是在學編程還是在向七十年代致敬?編程是這樣無法給人成就感的活動嗎?是,也不是。看你的表述,應該不是小孩子了,因為小孩子不會因為初學編程能做的事情很少而沒有成就感,或者說,覺得這樣做沒有成就感的小孩子根本不會繼續學下去。最初學編程的成就感單純來自于「我居然可以指揮機器做一些事」,至少我小時候用中華學習機編一個程序幫我算暑假作業上的四則運算題時是這樣感覺的。寫出這些程序并用它解題雖然遠比自己動筆去把題目算出來費時,卻讓人樂此不疲。那時候我還不知道馬里奧碰到花會變身這種事情其實也是靠編程編出來,所以我也不會去想學編程「并 不能 做什么」。

無奈大多數人過了一定年紀就很難再靠「我能指揮機器」這種簡單原始的快樂來驅動自己學編程。見過世面,聽過傳言,欲望和野心變得復雜而龐大,你想要圖形界面,音樂音效,人工智能,云端同步,可是你悶頭學了幾堂課,還是只學會在黑框里顯示一串數字。你懷疑這是學 C 語言的錯,于是你到知乎上來問了這個問題。

你的疑惑是有道理的。

如果能把編程學下去,日后你就會明白,任何程序都是一座冰山,最終用戶能看到的界面和使用的功能,只是程序浮在水面上的十分之一。知乎這個網站其實也是個運行在某臺電腦上的程序,你能看到的十分之一是用什么編寫的呢?HTML,CSS,JavaScript,或者 Objective-C。而你看不到的那十分之九是用什么編寫的呢?Python。這些你無法直接觀測到的 Python 程序運行在世界某個角落的某些計算機上,隔著光纜、雙絞線和無線基站,為你面前或掌上的用戶界面注入生命。

<img src=”https://pic2.zhimg.com/4e6c238477813abd5335d7bf51b54c15_b.jpg” data-rawwidth=”518″ data-rawheight=”588″ width=”518″ data-original=”https://pic2.zhimg.com/4e6c238477813abd5335d7bf51b54c15_r.jpg”>(

學會了 C 語言真的可以開發出很多東西嗎?

(   http://xkcd.com/353/   )

……可是 Python 是用什么編寫的呢?C 語言(當然,這么說并不嚴謹,Python 理論上可以用任何其他語言實現,實際上也已經被用很多其他語言實現了,不過這并不是重點)。任何編程語言都是實現某個功能的工具,Python 實現了知乎這個網站的大部分功能,而 C 實現了「用 Python 寫程序」這個功能。為什么是 C?

C 很別扭又缺陷重重,卻異常成功。固然有歷史的巧合推波助瀾,可也的確是因為它能滿足對于這樣一種系統實現語言的需要:既有相當的效率來取代匯編語言,且又足夠地抽象而流暢,能夠用于描述各種各樣的環境之下的算法與交互。
C is quirky, flawed, and an enormous success. Although accidents of history surely helped, it evidently satisfied a need for a system implementation language efficient enough to displace assembly language, yet sufficiently abstract and fluent to describe algorithms and interactions in a wide variety of environments.
——C 語言之父,Dennis M. Ritchie

C 是初代程序員所使用的語言,那時候硬件很貴,軟件必須高效;而計算機的用戶都是職業程序員,對于硬件有足夠的理解。C 貼近硬件,就意味著它容易譯成機器能懂的語言,而它的設計者也并不需要操心普通人學起來可能會比較困難——而且,說真的,其實也不很難。但是,這么多年過去之后,軟件規模變得越來越大,C 就像錘子和手鋸,修小木屋得心應手,造摩天樓就比較力不從心;但 C 語言可以用來造出其他更適合建造摩天樓的工具,乃至組成摩天樓的預制件,就好比用錘子和手鋸造出挖掘機和吊車、混凝土板和一體門窗一樣(當然,這個類比并不十分貼切。可是沒有什么類比能貼切地描述軟件工程,因為軟件工程像許多東西,卻又什么東西都不像)。

所以,回到你的問題上來,是的,學會 C 計算機語言真的可以開發出很多東西,但除非內力深厚,場合適當,并且閑得蛋疼,大多數人不會拿 C 或者只拿 C 來開發太大的東西。如果你只是想要一門能夠讓你「編輯出一個啥子游戲或者軟件出來」的語言,而且你用 Windows,那建議你轉去學學 C#。它長得和 C 挺像,但卻能迅速地寫出至少是帶有圖形界面的程序,用起來也很方便,鼠標點一點就能讓你對自己的程序看起來什么樣有個比較直觀的印象。還有,在國內,C# 的教材也相當容易找到。當然 Python 也是一個很好的選擇。

<img src=”https://pic4.zhimg.com/601cf5b6adc3d883a8cc9e6327f41637_b.jpg” data-rawwidth=”640″ data-rawheight=”429″ width=”640″ data-original=”https://pic4.zhimg.com/601cf5b6adc3d883a8cc9e6327f41637_r.jpg”> 學會了 C 語言真的可以開發出很多東西嗎?

另外,還有一件事你必須弄明白:現代的所謂編程這一活動,其實大部分時候是在「合理地堆砌別人已經實現的功能來實現新的功能」,C 語言莫不如是,比如 printf 這個東西,是別人做出來的「把一些數據按照指定格式輸出到屏幕上」這一功能。而別人還做出來許多其他功能,比如「在發現用戶短時間內連續兩次按下鼠標又松開的時候調用你寫好的一個函數」。學會怎樣在 C 或者其他任何程序語言中使用這些既有功能,也是學習編程的一門重頭戲。等你弄明白這一點,你也就找到了你問題的答案。

尾注:題圖畫錯了。馬里奧身寬應為 16 像素,我畫成了 17。

來自: http://www.linuxeden.com/html/news/20160227/164968.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!