自學c語言,有什麼好的建議或方法嗎?
一邊工作一邊學習,想改變一下自己,時間不是很多,目前在看書,感覺提升的很慢,看了一個月,覺得像是在原地踏步。僅僅死記硬背了幾個很簡單的文字顯示程序。想問問各位大神有沒有好的建議,謝謝!
看完了最基礎的書之後可以看看這個 : https://github.com/mit-pdos/xv6-public 一個簡單的類 Unix 的操作系統. 代碼簡潔易懂. 當然你也可以學到一些 *nix 的基本命令的實現方式: 比如: mkdir, ls, rm 等等...
英文文檔: http://pdos.csail.mit.edu/6.828/2012/xv6/book-rev7.pdf 這裡是中文文檔: xv6 中文文檔 · GitBook當然, 有興趣的話, 也可以把MIT的操作系統課程學了: 6.828 / Fall 2016
新年快樂~學計算機語言,最簡單最挫的方法一般就是看書,看書上代碼自己敲一遍。這是我以前自學時的方式。這種方式最大的問題就是似懂非懂,因為看和想都是作者的思維不是你思維。
你需要的是更多人的思維,總結出你的思維,所以需要上網找代碼,看代碼,然後按自己想法寫代碼。
簡單的說就是多實踐。找代碼:最簡單就是百度,csdn,什麼的,當然正規渠道就上github, codeproject, sourceforge,stackoverflow 國外真的大把看代碼:水平菜點用visual studio + visual assist X,學會一些基本調試技,能調試絕對是理解代碼的最好方式。水平好點就可以脫離調試,source insight, sublime, vim+ctags
事實上看代碼這個過程是最難受的,因為有時候你會發現根本看不懂別人在寫啥,這是個痛苦的過程,遇到這種情況,可以降低要求再找一些更簡單的項目,也可以硬啃,不懂就查書,查百度,google,stackoverflow。寫代碼:寫代碼必須是目的性,想清楚要做什麼,獨立完成,
看書的目的是要寫出自己想法的代碼,光看不寫,等於白看。
如果樓主覺得這個流程轉不動,那得先補點點數據結構。反對一些答主的觀點,題主問的是自學C語言的建議或方法,部分答主根本沒答到點上,反而答了一大堆比如系統編程,彙編,面向對象,Linux甚至單片機等無關內容,雖然他們都與C語言有關,但對於題主來說有個卵用?
回答題主問題:看題主描述像是初學編程的,有幾個建議。1、看經典書,比如經典的KR《C程序設計語言》
還有《C陷阱與缺陷》 這本書很薄,我當時學C語言時有些複雜聲明不是很懂,看完這本書就明白了。遇到不懂的可以上網查資料,網上資料非常多,我認為學習編程看視頻進度太慢,沒有看書來的快。2、動手寫,學編程一定要多動手,把課本上的例子動手敲一遍,初學嘛,一定要認真熟悉編程思維,不是無腦抄,多想。書後的練習題要做,再對答案,手熟了就會了,對語言特性熟悉了就好了。3、根據你的計劃再學別的東西,比如其他答主說的那樣。雖然你問的是如何學c語言,但是我覺得你最好搞清楚自己的真正目標
1,如果是想找份好工作,完全是為了錢,答案是別學c語言,這玩意又不流行,你學它準備找啥工作?別看有的大牛用c語言拿著高薪,那是有歷史原因的2,如果你想搞競賽,搞演算法,也不贊成從c語言學起,如果你剛入門,c語言絕對是相對難的,建議從c#,java,matlab之類較簡單的語言學起,我們當年是沒得選,現在有的選明顯先學簡單的利於你儘快進入演算法的學習,等你對各種演算法有了比較深的認識,萬一要用到c回頭再學不遲,而且那時會覺得簡單的多3,如果你是為了考試,那就隨便學學吧。。。反正就那麼幾個題型,刷兩遍也就過了,但是你就是考100分,也只是考試考過了而已,其實並沒有學懂什麼(我當年大一考了98,覺得考完了啥都不懂。。。也確實是啥都不懂)4,如果你的志向就是c語言相關編程,比如嵌入式,首先我要告訴你,現在的很多領域都是往c++去了,所以你的目標應該是c++而不僅僅是c,c的面向過程的結構已經有點過時了,都變成c++只是時間問題嵌入式編程其實模電數電知識更重要,啥語言只是工具罷了,嵌入式用的語言有的很奇葩,比如說Verilog HDL什麼的(我師傅就是寫這個的,愣是沒把我教會。。。估計是我電路知識太磕磣了),如果你非要走嵌入式這條路,有可能會轉這方面,所以不要僅限於c,而要多接觸別的方面,但是說到底語言只是工具,既然選擇了做嵌入式,就要有認識:電路知識比語言本身重要,由於一般這種程序寫不長,很多高級語言功能根本用不上,反倒是電路的不了解會讓你根本寫不下去5,如果你的志向是搞linux開發,圖形引擎開發,圖像處理,後端什麼的,那也是c++的天下,只不過重點變成了操作系統,linux開發,qt,網路,圖形學,圖像學什麼的,直接學c++把,不過要做好心理準備,這玩意可能是現在流行的最難用的語言沒有之一了,還是回到1,如果你是為了錢。。。真沒必要
但是不管你學啥
過程都應該是1,通讀理論(通讀就夠了)2,看別人的開源代碼3,動手做點小東西(如果有機會參與到大項目更好,不過還沒上班的人是沒這機會的,甚至有的人十幾年也就做某公司的一小塊)4,遇到問題,回到書本或者網路找答案至於看什麼書,動手做啥,怎麼用網路,我就不推薦了,大家為了這個都爭破頭了,對於入門的,其實也不是那麼重要,你就找本最薄的就行,反正判斷哪本書好,也是你必備的專業素養可惜沒多少人看我的回答!
看了也沒多少信我這個菜鳥的!講真,之前自學了c(看書),,,以為自己c很遛了!後來,後來,後來看了浙江大學翁凱老師的視頻(偶爾公交上看),真心講的不錯,還有他講的c++!
:真心的,翁愷老師的c語言和c++視頻真心講的不錯!!!我純粹推薦一些書本吧。自學最大的問題就是不知道學到的知識能做什麼。
首先,我推薦清華王爽的《彙編語言》。儘管這本書講的都是16位的8086彙編,但是作為入門書籍非常連貫,建議看完一章,就做習題對答案,在邊看書邊上機練習,用的是debug來調試。就算沒能做到舉一反三,也要將書中的代碼敲上一邊。看這本書,基本就了解底層寄存器,了解指針。也會知道PUSH POP指令, 了解到棧的實現。彙編分Intel和ATT,也不用過分在意,懂一個就可以了。
其次,我推薦《C primer plus》。這本書是關於C語言的入門書,可以詳細看看具體的內容,重點理解C語言的指針(包括數組)和結構體,這樣至少可以看看數據結構的知識,鏈表、棧、隊列、樹等都要用到指針和結構體。如果實在不理解數據結構就先放放,熟練C的基本知識先, 本書後面章節就帶你進入數據結構了。《一站式學習C編程》這本書,也推薦看看,了解C語言的寬度,不求深度。Linux的gcc編譯、gdb調試和Makefile管理C語言是個坑,放一放,還是用微軟的編譯器吧。實在想更進一步, 我就建議裝上虛擬機運行一個linux系統了, 去學習了解一個新的操作系統。(想裝虛擬機就要尋找資料, 自己努力一番。實在不行, 我可以和你一起分享實現過程)
接著,我希望你去看《CSAPP》。有了彙編和C語言基礎,慢慢啃這本書。CSAPP的第三章 程序的機器級表示 這裡用的是ATT彙編,詳細分析了C語言在GCC編譯為彙編的效果,看看這章,你一定會懂得C語言函數的棧幀,深刻明白變數的作用域。第七章 鏈接 《一站式學習C編程》、《程序員的自我修養》有詳細的分析,結合看,清楚幾個段作用足以。同時,後者簡單說明了編譯的過程。 第八章 異常控制流 理解進程和信號,懂得system call的進程fork、execve,信號signal...等等 第九章 虛擬存儲器 物理地址和虛擬地址的映射,頁的機制,動態分配內存的實現。第十章 系統級I/O 同樣也是system call,open、read、write等等,實現了更安全的RIO函數。 第十一章 網路編程 這章是我最推薦的,實現了一個tiny伺服器,,同樣system call,sock、connect、bind、listen、accept,用fork和execve實現CGI程序。(csapp.h頭件中有關線程部分,gcc編譯時必須帶 -l pthread選項)
有興趣可以看看《30天自製操作系統》, 也算我們進一步的學習。想著往一個方向深入前進一下。因為我自己也是在學習, 我感覺有了前面的基礎, 看這本書不成問題, 其次作者在書中非常詳細地解釋了各個步驟。知識點用專欄去解釋,非常用心。對了,因為成書比較早,光碟的工具還要處理一番,可以去圖靈社區看看。要是你對這本書有興趣, 那麼我推薦你看看《X86彙編語言 從實模式到保護模式》, 這樣可以了解保護模式, 這本書是製作硬碟啟動,用bochs來調試的。事實,對我們普通人來說,入門一定從簡,從輕,培養興趣。我之前說不要接觸操作系統,是因為我覺得太雜太繁瑣, 不適合我們。我說就算寫輕量操作系統這事是對著別人代碼抄的,調試出現的bug,也不是一般人的能力能做到的。其實,像一個玩具的操作系統,我們還是可以嘗試一下的,畢竟可以讓我們體驗一下C語言可以做什麼。當然,要是你有興趣去操作51單片機等硬體,也是可以去嘗試的,只有嘗試了,才知道自己知識的不足。
找到在自己能力之上一點的知識,慢慢地學習再進步。我也在學習,願大家同進步。對了,我建議首先將上面的實體書全都買到,要捨得花錢,畢竟花錢以後你就會捨不得,會好好看書。各種書可以交叉夾雜著看,關注知識點。
最後只有兩個字:堅持。千萬要不求甚解,要囫圇吞棗。
別卡在一兩個小問題,小不解上。
往前走,走得遠了,走得多了。以前不明了的可能早不是問題了。我是15年初學的C語言,以前零基礎,大學時連計算機二級都沒去考自然是一點準備都不會有的,完完全全的零基礎。但是我用了一個星期,每天四五個小時,最多最多半個月,就理解了c語言(其實也就是一般編程語言)的邏輯和程序結構,掌握了語法,對指針有一個透徹的理解,並且用c實現了基於幾類數據結構的常用演算法。這些數據結構涵蓋了從隊列到圖的一般數據結構。
不是我有多聰明。而是我在14年下半年的時候看了幾本計算機基礎的書。
因此,對這樣的問題,我的建議只有一個,用通俗易懂的入門書籍補一下計算機的基礎,最起碼對內存的線性模式要有一個形象的認識。
推薦的入門書在我另一個關於c語言自學的答案里有。知乎上有很多大牛也有推薦。書目不難找。
我強調的是:用通俗易懂的國外教材先補基礎。
為方便還是貼一下鏈接吧
《計算機科學導論(原書第3版)》([美]Behrouz Forouzan)【摘要 書評 試讀】- 京東圖書《計算機科學概論(原書第3版)》([美]戴爾,[美]劉易斯)【摘要 書評 試讀】- 京東圖書可以寫一個管理系統,這樣你對c語言的理解就能上升一個高度了,還能提升後續學習興趣。
功能實現基本的增刪查改,家人的姓名、年齡、生日等。
我見過一個奇葩寫了一個在追女生信息管理系統,然後每項給予不同權重,根據各個女生日常生活的不同反應進行打分,譬如今天跟某某女生聊多久天,今天跟某某女生吃飯了,今天某某女生主動跟他笑了。。。然後計算出總分按順序表白。。。。
竟然成功了,當時我就跪了。。。。直接上手C++啊……然後上ZOJ做題去,從簡單的做起,網上也有ZOJ題目分類表。然後可以學visual C++了,圖形界面編程自己寫點小軟體挺好玩的!記住一定是興趣第一!!有了興趣就有源源不竭的動力
如果你把死記硬背例子作為學習編程的一種方法的話,那你永遠都不會學會編程。編程本質上是你對一個問題的發現、分析、歸類(建模)、解決,以及之後的反覆自我反思,逐步完善的過程。而代碼,僅僅是體現這些工作的結果而已。無論是什麼編程語言,語法和代碼其實都不重要,重要的是上面我說的那一套思維邏輯能力和經驗。沒有這些哪怕你把整份標準文本背下來,也不能說你學會了編程,頂多讓你考試拿100分,僅此而已。
忽然想要補充一本書,其實很好但是忘記說了《程序員的自我修養》,真的很基礎,特別適合想轉行又不是科班出身的白丁,譬如我。。。。
=====================================================================我的情況跟題主很像,現在已經轉行做程序猿了。請關注我特意擴起來的書名!!!!剛畢業時候在it公司打雜,類似於項目助理。當時自己讀書,看《鳥哥的私房菜》看了大概三遍。然後轉做測試,當時有讀測試的藝術啊,性能測試等數,然後同時還讀了《how to c programming》漢語名叫啥我忘記了,這本書讀了三遍。還有一本書《unix高級編程》比較厚一本書,讀了四遍。《操作系統原理》讀了一遍,《unix內核原理》在讀。還有很熱的譚浩強那本書並沒有讀過....現在姑娘我已經做了兩年半的程序猿,基於linux研發,感覺不錯哦。
BTW用我們領導的話說,我本科學的是母豬的產後護理。
看了幾個高分答案,竟然全都是在介紹閱讀的資料。反而提倡多動手多寫代碼的答案,贊同的那麼少。建議題主參見 @老碼農 的答案。判斷一個答案的正確與非,不是看有多少信息和鏈接,如果路都走錯了,更多的信息也是枉然。
就像很多人平時不健生,夢想吃個葯,開個刀就能變苗條。平時不努力工作,夢想中個彩票就能財務自由。說到底,就是怕碼代碼累,懶!最好躺在床上看看書就能成為比爾蓋茲了。
編程能力是敲代碼出來的,不是看書看出來的!
編程能力是敲代碼出來的,不是看書看出來的!編程能力是敲代碼出來的,不是看書看出來的!在業界衡量一個程序員的能力是用萬行代碼來計算的,這個人有100萬代碼的經驗,就是比你這個20萬行代碼的牛逼。所以樓主你覺得自己原地踏步,是因為你什麼都沒做,光看書不寫代碼,2天後和沒看書沒區別。
樓主下次看書的時候,會在樹上看到很多代碼的樣例。建議在看懂代碼後,自己給自己設定一個目的,然後用學過的代碼來嘗試的實現它。
打個比方,你這一章節剛看完字元串如何處理,而上一個章節,你學會了如何打開和保存文本文檔。那你現在就給自己設定一個目標:設定一個Txt文檔,然後你往裡面輸入大量待處理的信息。然後運用你學過的兩個章節的內容,做一個小程序,讀取你指定的TXT文件,然後將其中的信息進行處理後保存。
現在讓你去網上找代碼我覺得還太早,循序漸進一點點來。先把書本上的知識融會貫通後在去找更高深的信息。但是融會貫通不是靠看書,是靠自己一點一點動手累積起來的。C語言裡面東西從易到難也多,先要入門,掌握基本的幾個東西, 背根本沒用的,頂多有點印象,舉例Helloworld程序, stdio.h是什麼意思, standard input output的縮寫,就是基本輸入輸出,#include 字面意思 包含了這個工具, 有這個工具,你才能在命令行標準列印字元數字。總之就是理解,背這種方法對於時間不多的你等於浪費時間,推薦C語言之父的 C教程。《The C Programming Language》也就是這本書,慢慢看,看不懂的邊寫例子邊反覆看。一直反覆看,配合好的視頻教程, 我之前看過的一個入門級別的《好爽,C語言》他講的做入門就很好。 還有樓上那些秀優越的不要誤導新人,就用windows系統學,不要一上來就linux下,MAC下,就windows 用 vs 2012以及以上。 把C語言的脈絡掌握清楚,有關數學的演算法可以先擱下。學到文件就停止。然後上C++,這裡C++不是VC,沒有VC++這一說法,那叫MFC。和數據結構。C++和java不要混學會亂的,C、C++ 數據結構 好比內功,可能用不到,但對於系統學習的你來說百利無一害。C++和數據結構掌握了,嘗試寫C/C++兩個版本的基本數據結構鏈表,棧,表,和基於此的多個排序演算法。 之後就可以轉java C#或者 windows API(這貨是個工具庫和系統交互的)。
首先學習計算機科學和那些理論,然後摸索出你自己的編程風格,然後把那些都忘掉,亂來就行了。 -- George Carrette
總結得很好,我很受用,與你分享。基於libpcap做個簡單的網路數據包分析工具吧,比看什麼xv6,程序員的自我修養,csapp之類的有效的多。xv6類的書不是現階段看的,你現在需要做的就是徹底理解c語言指針的用法。而不是二進位程序在內存中的整個視圖。
這個問題回答的人好多啊,大家對如何學好C語言是非常感興趣的。我也說說我的看法吧。
學習C語言,不乏如下幾個步驟:
1. 找個東東帶你入門。這個東東可以是老師,可以是書籍,可以是視頻,可以是講義,可以是一切的東東。如果是老師,最好是經歷過實際編程項目的人,他們經驗多,可以教會你很多。學校里的老師嘛,很多都是理論夢想家,恐怕教不出你實際的東西。書籍,我建議盡量看國外大牛寫的,國內的教材還是少看為好!這裡我說下譚教授的教材。我當初學習C語言時教材就是教授的教材,寫的比較通俗易懂,最起碼把我領進了門。當入門了以後,想進一步提高自己的水平,就不要死摳著教授的教材了,可以看看國外大牛們的書了。
2. 入門了,當你坐在電腦前,你不一定會立即就能寫出代碼。不過沒關係,你可以先從敲一些很簡單的代碼開始練起。給自己找一些簡單的小需求,比如高校里的課程設計要求做的項目啊,自己去網上找一些別人提的需求啊等。尤其現在有很多的開源項目,你可以多看看人家的思路和技巧;
3. 多總結,多分享。你在編程中,肯定會遇到很多困難,走了很多彎路,把它們寫出來,總結出來,拿出來跟別人討論,就像我在我的公眾號「C語言編程技術分享」,就大家對C語言有疑問的地方,不理解的地方,比如指針,鏈表等,寫了一些文章,爭取將這些難點寫的通俗易懂,希望能給你幫助!這期間肯定有人會鄙視你,嘲笑你的技術,別放心上,誰沒有個菜鳥期,他們生下來就是高手嗎?
4. 參與到項目中。這個項目不管是公司分配的也好,不管是開源的也好,用心去做,做的過程慢慢琢磨,慢慢摸索,不斷向周圍的人請教,學習!
其實說了這麼多,無非就是兩個字「練習」,四個字「持之以恆」!很多人就是沒有那個心坐下來,堅持不下去。
加油,去實現你的夢想吧!
換個Linux系統,什麼ls命令啊,之類的,用C語言實現一遍吧,發現沒有別人牛逼在實現一遍,捎帶手看看網路,然後做點工程,慢慢培養
1. 語言特性
2. 標準庫中的IO、內存分配,以及posix中的進程、線程、FS和套接字3. 基本的數據結構,比如鏈表和哈希4. 基本的面向對象,比如函數指針實現虛函數、宏實現反射等
5. 工具鏈:gcc、gdb、make、objdump、valgrind譚書僅僅相當於一個Small C。C語言發展到現在早就不只是譚書寫的時候那套東西了。看一些開源代碼會很有幫助。推薦glib,可讀性比較好,文檔也較全。
推薦閱讀:
※C++標準庫中有哪些危險函數?
※如何學好編程語言以及進行軟體開發?
※美劇《矽谷》第三季第一集神秘代碼寫的是什麼?
※C++ 有哪些鮮為人知的奇特操作?
※以C++為核心語言的高頻交易系統是如何做到低延遲的?