第一篇:程序員之路──為何要學(xué)好C語言
程序員之路──為何要學(xué)好C語言----轉(zhuǎn)
2008-07-23 16:26 學(xué)習(xí)C語言不是一朝一夕的事情,但也不需要花費(fèi)十年時(shí)間才能精通。如何以最小的代價(jià)學(xué)習(xí)并精通C語言是本文的主題。請(qǐng)注意,即使是“最小的代價(jià)”,也絕不是什么捷徑,而是以最短的時(shí)間取得最多的收獲,同時(shí)也意味著你需要經(jīng)歷艱苦的過程。
一、要讀就讀好書,否則不如不讀
所有初學(xué)者面臨的第一個(gè)問題便是:如何選擇教材。好的開始是成功的一半,選擇一本優(yōu)秀的教材是事半功倍的關(guān)鍵因素。不幸的是,學(xué)校通常會(huì)幫你指定一本很差勁的C語言課本;而幸運(yùn)的是,你還可以再次選擇。
大名鼎鼎的譚浩強(qiáng)教授出了一本《C語言程序設(shè)計(jì)》,據(jù)說發(fā)行量有超過400萬,據(jù)我所知,很多學(xué)校都會(huì)推薦這本書作為C語言課本。雖然本人的名字(譚浩 宇)跟教授僅僅一字之差,但我是無比堅(jiān)定地黑他這本書的。這本書不是寫給計(jì)算機(jī)專業(yè)的學(xué)生的,而是給那些需要考計(jì)算機(jī)等級(jí)考試的其它專業(yè)學(xué)生看的。這本書 的主要缺點(diǎn)是:例子程序非常不專業(yè),不能教給你程序設(shè)計(jì)應(yīng)該掌握的思考方式;程序風(fēng)格相當(dāng)?shù)夭缓?,?huì)讓你養(yǎng)成亂寫代碼的惡習(xí);錯(cuò)誤太多,曾經(jīng)有人指出過這 本書的上百個(gè)錯(cuò)誤,其中不乏關(guān)鍵的概念性錯(cuò)誤。好了,這本書我也不想說太多了,有興趣大家可以百度一下:)
Kernighan和 Ritchie的《The C Programming Language》(中譯名《C程序設(shè)計(jì)語言》)堪稱經(jīng)典中的經(jīng)典,不過舊版的很多內(nèi)容都已過時(shí),和現(xiàn)在的標(biāo)準(zhǔn)C語言相去甚遠(yuǎn),大家一定要看最新的版本,否則不如不看。另外,即使是最經(jīng)典最權(quán)威的書,也沒有辦法面面俱到,所以手邊常備一本《C語言參考手冊(cè)》是十分必要的?!禖語言參考手冊(cè)》就是《C Reference Manual》,是C語言標(biāo)準(zhǔn)的詳細(xì)描述,包括絕大多數(shù)C標(biāo)準(zhǔn)庫函數(shù)的細(xì)節(jié),算得上是最好的標(biāo)準(zhǔn)C語言的工具書。順便提一句,最新的《C程序設(shè)計(jì)語言》是 根據(jù)C89標(biāo)準(zhǔn)修訂的,而《C語言參考手冊(cè)》描述的是C99標(biāo)準(zhǔn),二者可能會(huì)有些出入,建議按照C99標(biāo)準(zhǔn)學(xué)習(xí)。還有一本《C和指針》,寫得也是相當(dāng)?shù)夭?錯(cuò),英文名是《Pointers on C》,特別地強(qiáng)調(diào)指針的重要性,算是本書的一個(gè)特點(diǎn)吧。不過這本書并不十分適合初學(xué)者,如果你曾經(jīng)學(xué)過C語言,有那么一些C語言的基礎(chǔ)但又不是很扎實(shí),那 么你可以嘗試一下這本書。我相信,只要你理解了指針,C語言便不再神秘。
如果你已經(jīng)啃完了一本C語言教材,想要更進(jìn)一步,那么有兩本 書你一定要看。首先是《C Traps and Pitfalls》(中譯名《C陷井與缺陷》),很薄的一本小冊(cè)子,內(nèi)容非常非常地有趣。要注意一點(diǎn),這本書是二十多年前寫成的,里面提到的很多C語言的 缺陷都已被改進(jìn),不過能夠了解一些歷史也不是什么壞事。然后你可以挑戰(zhàn)一下《Expert C Programming》(中譯名《C專家編程》),書如其名,這本書頗具難度,一旦你仔細(xì)讀完并能透徹理解,你便可以放心大膽地在簡歷上寫“精通C語 言”了。切記一個(gè)原則,不要讀自己目前還看不懂的書,那是浪費(fèi)生命。如果你看不懂,那你一定是缺失了某些必需基礎(chǔ)知識(shí)。此時(shí),你要仔細(xì)分析自己需要補(bǔ)充哪些內(nèi)容,然后再去書店尋找講述的這些內(nèi)容的書籍。把基礎(chǔ)知識(shí)補(bǔ)充完畢再回頭來學(xué)習(xí),才會(huì)真正的事半功倍。
二、Unix/Linux還是Windows,這是個(gè)很大的問題
不同的編程環(huán)境會(huì)造就出不同思維的程序員。Windows的程序員大多依賴集成開發(fā)環(huán)境,比如Visual Studio,而Unix程序員更加鐘愛Makefile與控制臺(tái)。顯而易見,集成開發(fā)環(huán)境更容易上手,在Windows上學(xué)習(xí)C語言,只需要會(huì)按幾個(gè)基 本的Visutal C++工具欄按鈕就可以開始寫Hello, World!了,而在Unix下,你需要一些控制臺(tái)操作的基本知識(shí)。有人也許認(rèn)為Unix的環(huán)境更簡潔,但習(xí)慣的力量是很大的,大家都很熟悉 Windows的基本操作,而為了學(xué)習(xí)C語言去專門裝一個(gè)Unix系統(tǒng),似乎有點(diǎn)不劃算。
對(duì)于一個(gè)只懂得Windows基本操作、連 DOS是什么都不知道的新手而言,盡快做一些有趣而有意義的事情才是最重要的。用C語言寫一個(gè)小程序遠(yuǎn)比學(xué)習(xí)ls、cat等命令有趣,況且我們要專注于C 語言本身,就不得不暫時(shí)忽略一些東西,比如編譯鏈接的過程、Makefile的寫法等等等等。
所以我建議初學(xué)者應(yīng)該以Visual C++ 6.0(不是VisualC++.NET)或者Dev C++作為主要的學(xué)習(xí)環(huán)境,而且千萬不要在IDE的使用技巧上過多糾纏,因?yàn)榻窈竽阋欢ㄒD(zhuǎn)向Unix環(huán)境的。Visual C++ 6.0使用很方便,調(diào)試也很直觀,但其默認(rèn)的編譯器對(duì)C標(biāo)準(zhǔn)的支持并不好,而Dev C++使用gcc編譯器,對(duì)C99的標(biāo)準(zhǔn)都支持良好。使用順帶提一下,很多大學(xué)的C語言課程還在使用Turbo C 2.0作為實(shí)驗(yàn)環(huán)境,這是相當(dāng)不可取的,原因其一是TC 2.0對(duì)C標(biāo)準(zhǔn)幾乎沒有支持,其二是TC 2.0編譯得到的程序是16位的,這對(duì)今后理解32位的程序會(huì)造成極大的困擾(當(dāng)然,用djgpp之類的東西可以使TC 2.0編譯出32位程序,不過那過于復(fù)雜了)。
等你學(xué)完一本C語言的教材,你一定要轉(zhuǎn)向Unix平臺(tái)繼續(xù)學(xué)習(xí),幾乎所有的C語言高級(jí) 教程都是基于Unix平臺(tái)的(比如《C專家編程》)。轉(zhuǎn)變的過程是痛苦的,你需要面對(duì)的是各種紛繁復(fù)雜的命令,完全不同于Windows平臺(tái)的思考方式,但是這種痛苦是值得的。Unix與C是共生的,Unix的思考方式和習(xí)慣更加符合C語言的思考方式和習(xí)慣。在Unix下,你可以找到無數(shù)優(yōu)秀的源代碼供你 盡情閱讀,你可以方便地查看某個(gè)庫函數(shù)的聯(lián)機(jī)手冊(cè),還可以看到最優(yōu)秀的代碼風(fēng)格(說到代碼風(fēng)格,我會(huì)專門寫一篇文章詳細(xì)敘述)。
歸結(jié)起來就是一句話:初學(xué)C語言,建議使用Windows系統(tǒng)和集成開發(fā)環(huán)境,在準(zhǔn)備向“高手”方向努力時(shí),請(qǐng)先轉(zhuǎn)向Unix平臺(tái)。
三、萬事俱備,你就是東風(fēng)
書已選定,環(huán)境配置完成,正所謂萬事俱備,只欠你自己的努力了。請(qǐng)從書的前 言開始,仔細(xì)地閱讀手頭的教材,很多人看書喜歡直接從第一章開始看,這是錯(cuò)誤的做法。前言是作者對(duì)整本書的大體介紹,作者一般會(huì)告訴你需要什么基礎(chǔ)才能夠 順利閱讀本書,這可以幫助你檢驗(yàn)自己的基礎(chǔ)知識(shí)是否已經(jīng)具備??赐昵把?,還要瀏覽一下目錄,了解一下書的整體結(jié)構(gòu),順便給自己安排一下學(xué)習(xí)計(jì)劃。
學(xué)習(xí)C語言,必需注意每一個(gè)細(xì)節(jié),書上的例子代碼一定要自己親自敲一遍,編譯執(zhí)行輸出都跟書上說的一致才能算是學(xué)完了一個(gè)例子,如果不一致,就要仔細(xì)找 原因。出了書本上有的例子,自己還要“創(chuàng)造”一些例子,比如學(xué)習(xí)運(yùn)算符優(yōu)先級(jí)的時(shí)候,可以寫幾個(gè)相同的表達(dá)式,在不同的位置加上括號(hào),看看有哪些不同的行 為,比如*p++和(*p)++,又比如a = b == c、(a = b)== c和a =(b == c)等等。自己抄的書上的例子以及改造之后的例子,還有自己“創(chuàng)造”的例子,都應(yīng)該仔細(xì)地歸類保存,并且要在源代碼中寫上簡短的注釋,闡述這個(gè)例子的意 圖。
例子之后就是習(xí)題了,我建議初學(xué)者把所有的習(xí)題都獨(dú)立做一遍,然后對(duì)照答案的代碼,看看自己的代碼有那些不足,再試著修改自己的代碼。很多人不重視習(xí)題,這是極大的錯(cuò)誤,因?yàn)樽髡咄ǔ?huì)在習(xí)題中說明一些重要的道理,而不是單純地檢驗(yàn)前面的知識(shí)。
也許你認(rèn)為這樣學(xué)習(xí)太慢,其實(shí)不然。學(xué)得細(xì)致就不用走回頭路,等你學(xué)到后面才發(fā)現(xiàn)自己前面沒搞清楚,那才是真的得不償失。一般說來,整本書讀完,你應(yīng)該 完成數(shù)千行乃至上萬行的代碼,無論是原封不動(dòng)照抄書上的,還是自己心血來潮寫就的,都是今后繼續(xù)學(xué)習(xí)的一筆財(cái)富。以我自己舉例,閱讀《Windows核心 編程》時(shí)(我只閱讀了3/4的內(nèi)容),除了抄書上的代碼,還自己寫了很多例子,一共有5574行(用unix下的wc工具統(tǒng)計(jì)),時(shí)隔多日,我早已記不清 Windows的系統(tǒng)編程了,但只要花幾分鐘翻出以前的代碼看看,便會(huì)重新了然于胸。所謂好記性不如爛筆頭,就是這個(gè)道理。
仔細(xì)讀書、認(rèn)真抄寫源代碼、獨(dú)立完成習(xí)題外加更進(jìn)一步的實(shí)驗(yàn),最后將所有的代碼留下,成為自己的經(jīng)驗(yàn)和財(cái)富,絕對(duì)的辛苦,也絕對(duì)的事半功倍。當(dāng)然,這種方式只適合學(xué)習(xí)需要精通的技術(shù),如果不是學(xué)習(xí)C語言,你還要具體情況具體分析。
寫到最后,還有非常非常重要的一點(diǎn)沒有提及──代碼風(fēng)格,從最開始學(xué)習(xí)就必須強(qiáng)迫自己模仿最優(yōu)秀的代碼風(fēng)格。因?yàn)榇a風(fēng)格太重要內(nèi)容也太多,我會(huì)用專門的一篇文章來詳細(xì)討論,請(qǐng)大家關(guān)注《程序員之路──關(guān)于代碼風(fēng)格》。
第二篇:29.如何學(xué)習(xí)C語言-----程序員之路
作者:t5k5 日期:2007-10-24
一周沒有寫東西了,今天上校內(nèi)的時(shí)候有個(gè)好友分享了這篇帖子,深有感觸,以后堅(jiān)決不用TC了,去下個(gè)VC++來學(xué)習(xí)C,哈哈~~還說我們用的教材太LJ了,這個(gè)我倒不怎么清楚,因?yàn)闆]學(xué)懂啊。。
看文章結(jié)尾的鏈接就知道是CSDN上的了,以下是原文:
=================T5K5的學(xué)習(xí)分割線=================
學(xué)習(xí)C語言不是一朝一夕的事情,但也不需要花費(fèi)十年時(shí)間才能精通。如何以最小的代價(jià)學(xué)習(xí)并精通C語言是本文的主題。請(qǐng)注意,即使是“最小的代價(jià)”,也絕不是什么捷徑,而是以最短的時(shí)間取得最多的收獲,同時(shí)也意味著你需要經(jīng)歷艱苦的過程。
一、要讀就讀好書,否則不如不讀
所有初學(xué)者面臨的第一個(gè)問題便是:如何選擇教材。好的開始是成功的一半,選擇一本優(yōu)秀的教材是事半功倍的關(guān)鍵因素。不幸的是,學(xué)校通常會(huì)幫你指定一本很差勁的C語言課本;而幸運(yùn)的是,你還可以再次選擇。
大名鼎鼎的譚浩強(qiáng)教授出了一本《C語言程序設(shè)計(jì)》,據(jù)說發(fā)行量有超過400萬,據(jù)我所知,很多學(xué)校都會(huì)推薦這本書作為C語言課本。雖然本人的名字(譚浩宇)跟教授僅僅一字之差,但我是無比堅(jiān)定地黑他這本書的。這本書不是寫給計(jì)算機(jī)專業(yè)的學(xué)生的,而是給那些需要考計(jì)算機(jī)等級(jí)考試的其它專業(yè)學(xué)生看的。這本書的主要缺點(diǎn)是:例子程序非常不專業(yè),不能教給你程序設(shè)計(jì)應(yīng)該掌握的思考方式;程序風(fēng)格相當(dāng)?shù)夭缓?,?huì)讓你養(yǎng)成亂寫代碼的惡習(xí);錯(cuò)誤太多,曾經(jīng)有人指出過這本書的上百個(gè)錯(cuò)誤,其中不乏關(guān)鍵的概念性錯(cuò)誤。好了,這本書我也不想說太多了,有興趣大家可以百度一下:)
Kernighan和Ritchie的《The C Programming Language》(中譯名《C程序設(shè)計(jì)語言》)堪稱經(jīng)典中的經(jīng)典,不過舊版的很多內(nèi)容都已過時(shí),和現(xiàn)在的標(biāo)準(zhǔn)C語言相去甚遠(yuǎn),大家一定要看最新的版本,否則不如不看。另外,即使是最經(jīng)典最權(quán)威的書,也沒有辦法面面俱到,所以手邊常備一本《C語言參考手冊(cè)》是十分必要的?!禖語言參考手冊(cè)》就是《C Reference Manual》,是C語言標(biāo)準(zhǔn)的詳細(xì)描述,包括絕大多數(shù)C標(biāo)準(zhǔn)庫函數(shù)的細(xì)節(jié),算得上是最好的標(biāo)準(zhǔn)C語言的工具書。順便提一句,最新的《C程序設(shè)計(jì)語言》是根據(jù)C89標(biāo)準(zhǔn)修訂的,而《C語言參考手冊(cè)》描述的是C99標(biāo)準(zhǔn),二者可能會(huì)有些出入,建議按照C99標(biāo)準(zhǔn)學(xué)習(xí)。還有一本《C和指針》,寫得也是相當(dāng)?shù)夭诲e(cuò),英文名是《Pointers on C》,特別地強(qiáng)調(diào)指針的重要性,算是本書的一個(gè)特點(diǎn)吧。不過這本書并不十分適合初學(xué)者,如果你曾經(jīng)學(xué)過C語言,有那么一些C語言的基礎(chǔ)但又不是很扎實(shí),那么你可以嘗試一下這本書。我相信,只要你理解了指針,C語言便不再神秘。
如果你已經(jīng)啃完了一本C語言教材,想要更進(jìn)一步,那么有兩本書你一定要看。首先是《C Traps and Pitfalls》(中譯名《C陷井與缺陷》),很薄的一本小冊(cè)子,內(nèi)容非常非常地有趣。要注意一點(diǎn),這本書是二十多年前寫成的,里面提到的很多C語言的缺陷都已被改進(jìn),不過能夠了解一些歷史也不是什么壞事。然后你可以挑戰(zhàn)一下《Expert C Programming》(中譯名《C專家編程》),書如其名,這本書頗具難度,一旦你仔細(xì)讀完并能透徹理解,你便可以放心大膽地在簡歷上寫“精通C語言”了。
切記一個(gè)原則,不要讀自己目前還看不懂的書,那是浪費(fèi)生命。如果你看不懂,那你一定是缺失了某些必需基礎(chǔ)知識(shí)。此時(shí),你要仔細(xì)分析自己需要補(bǔ)充哪些內(nèi)容,然后再去書店尋找講述的這些內(nèi)容的書籍。把基礎(chǔ)知識(shí)補(bǔ)充完畢再回頭來學(xué)習(xí),才會(huì)真正的事半功倍。
二、Unix/Linux還是Windows,這是個(gè)很大的問題
不同的編程環(huán)境會(huì)造就出不同思維的程序員。Windows的程序員大多依賴集成開發(fā)環(huán)境,比如Visual Studio,而Unix程序員更加鐘愛Makefile與控制臺(tái)。顯而易見,集成開發(fā)環(huán)境更容易上手,在Windows上學(xué)習(xí)C語言,只需要會(huì)按幾個(gè)基本的Visutal C++工具欄按鈕就可以開始寫Hello, World!了,而在Unix下,你需要一些控制臺(tái)操作的基本知識(shí)。有人也許認(rèn)為Unix的環(huán)境更簡潔,但習(xí)慣的力量是很大的,大家都很熟悉Windows的基本操作,而為了學(xué)習(xí)C語言去專門裝一個(gè)Unix系統(tǒng),似乎有點(diǎn)不劃算。
對(duì)于一個(gè)只懂得Windows基本操作、連DOS是什么都不知道的新手而言,盡快做一些有趣而有意義的事情才是最重要的。用C語言寫一個(gè)小程序遠(yuǎn)比學(xué)習(xí)ls、cat等命令有趣,況且我們要專注于C語言本身,就不得不暫時(shí)忽略一些東西,比如編譯鏈接的過程、Makefile的寫法等等等等。
所以我建議初學(xué)者應(yīng)該以Visual C++ 6.0(不是VisualC++.NET)或者Dev C++作為主要的學(xué)習(xí)環(huán)境,而且千萬不要在IDE的使用技巧上過多糾纏,因?yàn)榻窈竽阋欢ㄒD(zhuǎn)向Unix環(huán)境的。Visual C++ 6.0使用很方便,調(diào)試也很直觀,但其默認(rèn)的編譯器對(duì)C標(biāo)準(zhǔn)的支持并不好,而Dev C++使用gcc編譯器,對(duì)C99的標(biāo)準(zhǔn)都支持良好。使用順帶提一下,很多大學(xué)的C語言課程還在使用Turbo C 2.0作為實(shí)驗(yàn)環(huán)境,這是相當(dāng)不可取的,原因其一是TC 2.0對(duì)C標(biāo)準(zhǔn)幾乎沒有支持,其二是TC 2.0編譯得到的程序是16位的,這對(duì)今后理解32位的程序會(huì)造成極大的困擾(當(dāng)然,用djgpp之類的東西可以使TC 2.0編譯出32位程序,不過那過于復(fù)雜了)。
等你學(xué)完一本C語言的教材,你一定要轉(zhuǎn)向Unix平臺(tái)繼續(xù)學(xué)習(xí),幾乎所有的C語言高級(jí)教程都是基于Unix平臺(tái)的(比如《C專家編程》)。轉(zhuǎn)變的過程是痛苦的,你需要面對(duì)的是各種紛繁復(fù)雜的命令,完全不同于Windows平臺(tái)的思考方式,但是這種痛苦是值得的。Unix與C是共生的,Unix的思考方式和習(xí)慣更加符合C語言的思考方式和習(xí)慣。在Unix下,你可以找到無數(shù)優(yōu)秀的源代碼供你盡情閱讀,你可以方便地查看某個(gè)庫函數(shù)的聯(lián)機(jī)手冊(cè),還可以看到最優(yōu)秀的代碼風(fēng)格(說到代碼風(fēng)格,我會(huì)專門寫一篇文章詳細(xì)敘述)。
歸結(jié)起來就是一句話:初學(xué)C語言,建議使用Windows系統(tǒng)和集成開發(fā)環(huán)境,在準(zhǔn)備向“高手”方向努力時(shí),請(qǐng)先轉(zhuǎn)向Unix平臺(tái)。
三、萬事俱備,你就是東風(fēng)
書已選定,環(huán)境配置完成,正所謂萬事俱備,只欠你自己的努力了。請(qǐng)從書的前言開始,仔細(xì)地閱讀手頭的教材,很多人看書喜歡直接從第一章開始看,這是錯(cuò)誤的做法。前言是作者對(duì)整本書的大體介紹,作者一般會(huì)告訴你需要什么基礎(chǔ)才能夠順利閱讀本書,這可以幫助你檢驗(yàn)自己的基礎(chǔ)知識(shí)是否已經(jīng)具備??赐昵把?,還要瀏覽一下目錄,了解一下書的整體結(jié)構(gòu),順便給自己安排一下學(xué)習(xí)計(jì)劃。
學(xué)習(xí)C語言,必需注意每一個(gè)細(xì)節(jié),書上的例子代碼一定要自己親自敲一遍,編譯執(zhí)行輸出都跟書上說的一致才能算是學(xué)完了一個(gè)例子,如果不一致,就要仔細(xì)找原因。出了書本上有的例子,自己還要“創(chuàng)造”一些例子,比如學(xué)習(xí)運(yùn)算符優(yōu)先級(jí)的時(shí)候,可以寫幾個(gè)相同的表達(dá)式,在不同的位置加上括號(hào),看看有哪些不同的行為,比如*p++和(*p)++,又比如a = b == c、(a = b)== c和a =(b == c)等等。自己抄的書上的例子以及改造之后的例子,還有自己“創(chuàng)造”的例子,都應(yīng)該仔細(xì)地歸類保存,并且要在源代碼中寫上簡短的注釋,闡述這個(gè)例子的意圖。
例子之后就是習(xí)題了,我建議初學(xué)者把所有的習(xí)題都獨(dú)立做一遍,然后對(duì)照答案的代碼,看看自己的代碼有那些不足,再試著修改自己的代碼。很多人不重視習(xí)題,這是極大的錯(cuò)誤,因?yàn)樽髡咄ǔ?huì)在習(xí)題中說明一些重要的道理,而不是單純地檢驗(yàn)前面的知識(shí)。
也許你認(rèn)為這樣學(xué)習(xí)太慢,其實(shí)不然。學(xué)得細(xì)致就不用走回頭路,等你學(xué)到后面才發(fā)現(xiàn)自己前面沒搞清楚,那才是真的得不償失。一般說來,整本書讀完,你應(yīng)該完成數(shù)千行乃至上萬行的代碼,無論是原封不動(dòng)照抄書上的,還是自己心血來潮寫就的,都是今后繼續(xù)學(xué)習(xí)的一筆財(cái)富。以我自己舉例,閱讀《Windows核心編程》時(shí)(我只閱讀了3/4的內(nèi)容),除了抄書上的代碼,還自己寫了很多例子,一共有5574行(用unix下的wc工具統(tǒng)計(jì)),時(shí)隔多日,我早已記不清Windows的系統(tǒng)編程了,但只要花幾分鐘翻出以前的代碼看看,便會(huì)重新了然于胸。所謂好記性不如爛筆頭,就是這個(gè)道理。
仔細(xì)讀書、認(rèn)真抄寫源代碼、獨(dú)立完成習(xí)題外加更進(jìn)一步的實(shí)驗(yàn),最后將所有的代碼留下,成為自己的經(jīng)驗(yàn)和財(cái)富,絕對(duì)的辛苦,也絕對(duì)的事半功倍。當(dāng)然,這種方式只適合學(xué)習(xí)需要精通的技術(shù),如果不是學(xué)習(xí)C語言,你還要具體情況具體分析。
寫到最后,還有非常非常重要的一點(diǎn)沒有提及──代碼風(fēng)格,從最開始學(xué)習(xí)就必須強(qiáng)迫自己模仿最優(yōu)秀的代碼風(fēng)格。因?yàn)榇a風(fēng)格太重要內(nèi)容也太多,我會(huì)用專門的一篇文章來詳細(xì)討論,請(qǐng)大家關(guān)注《程序員之路──關(guān)于代碼風(fēng)格》。
第三篇:程序員之路──如何學(xué)習(xí)C語言并精通C語言
程序員之路──如何學(xué)習(xí)C語言
學(xué)習(xí)C語言不是一朝一夕的事情,但也不需要花費(fèi)十年時(shí)間才能精通。如何以最小的代價(jià)學(xué)習(xí)并精通C語言是本文的主題。請(qǐng)注意,即使是“最小的代價(jià)”,也絕不是什么捷徑,而是以最短的時(shí)間取得最多的收獲,同時(shí)也意味著你需要經(jīng)歷艱苦的過程。
一、要讀就讀好書,否則不如不讀
所有初學(xué)者面臨的第一個(gè)問題便是:如何選擇教材。好的開始是成功的一半,選擇一本優(yōu)秀的教材是事半功倍的關(guān)鍵因素。不幸的是,學(xué)校通常會(huì)幫你指定一本很差勁的C語言課本;而幸運(yùn)的是,你還可以再次選擇。
大名鼎鼎的譚浩強(qiáng)教授出了一本《C語言程序設(shè)計(jì)》,據(jù)說發(fā)行量有超過400萬,據(jù)我所知,很多學(xué)校都會(huì)推薦這本書作為C語言課本。雖然本人的名字(譚浩宇)跟教授僅僅一字之差,但我是無比堅(jiān)定地黑他這本書的。這本書不是寫給計(jì)算機(jī)專業(yè)的學(xué)生的,而是給那些需要考計(jì)算機(jī)等級(jí)考試的其它專業(yè)學(xué)生看的。這本書的主要缺點(diǎn)是:例子程序非常不專業(yè),不能教給你程序設(shè)計(jì)應(yīng)該掌握的思考方式;程序風(fēng)格相當(dāng)?shù)夭缓?,?huì)讓你養(yǎng)成亂寫代碼的惡習(xí);錯(cuò)誤太多,曾經(jīng)有人指出過這本書的上百個(gè)錯(cuò)誤,其中不乏關(guān)鍵的概念性錯(cuò)誤。好了,這本書我也不想說太多了,有興趣大家可以百度一下:)
Kernighan和Ritchie的《The C Programming Language》(中譯名《C程序設(shè)計(jì)語言》)堪稱經(jīng)典中的經(jīng)典,不過舊版的很多內(nèi)容都已過時(shí),和現(xiàn)在的標(biāo)準(zhǔn)C語言相去甚遠(yuǎn),大家一定要看最新的版本,否則不如不看。另外,即使是最經(jīng)典最權(quán)威的書,也沒有辦法面面俱到,所以手邊常備一本《C語言參考手冊(cè)》是十分必要的。《C語言參考手冊(cè)》就是《C Reference Manual》,是C語言標(biāo)準(zhǔn)的詳細(xì)描述,包括絕大多數(shù)C標(biāo)準(zhǔn)庫函數(shù)的細(xì)節(jié),算得上是最好的標(biāo)準(zhǔn)C語言的工具書。順便提一句,最新的《C程序設(shè)計(jì)語言》是根據(jù)C89標(biāo)準(zhǔn)修訂的,而《C語言參考手冊(cè)》描述的是C99標(biāo)準(zhǔn),二者可能會(huì)有些出入,建議按照C99標(biāo)準(zhǔn)學(xué)習(xí)。還有一本《C和指針》,寫得也是相當(dāng)?shù)夭诲e(cuò),英文名是《Pointers on C》,特別地強(qiáng)調(diào)指針的重要性,算是本書的一個(gè)特點(diǎn)吧。不過這本書并不十分適合初學(xué)者,如果你曾經(jīng)學(xué)過C語言,有那么一些C語言的基礎(chǔ)但又不是很扎實(shí),那么你可以嘗試一下這本書。我相信,只要你理解了指針,C語言便不再神秘。
如果你已經(jīng)啃完了一本C語言教材,想要更進(jìn)一步,那么有兩本書你一定要看。首先是《C Traps and Pitfalls》(中譯名《C陷井與缺陷》),很薄的一本小冊(cè)子,內(nèi)容非常非常地有趣。要注意一點(diǎn),這本書是二十多年前寫成的,里面提到的很多C語言的缺陷都已被改進(jìn),不過能夠了解一些歷史也不是什么壞事。然后你可以挑戰(zhàn)一下《Expert C Programming》(中譯名《C專家編程》),書如其名,這本書頗具難度,一旦你仔細(xì)讀完并能透徹理解,你便可以放心大膽地在簡歷上寫“精通C語言”了。
切記一個(gè)原則,不要讀自己目前還看不懂的書,那是浪費(fèi)生命。如果你看不懂,那你一定是缺失了某些必需基礎(chǔ)知識(shí)。此時(shí),你要仔細(xì)分析自己需要補(bǔ)充哪些內(nèi)容,然后再去書店尋找講述的這些內(nèi)容的書籍。把基礎(chǔ)知識(shí)補(bǔ)充完畢再回頭來學(xué)習(xí),才會(huì)真正的事半功倍。
二、Unix/Linux還是Windows,這是個(gè)很大的問題
不同的編程環(huán)境會(huì)造就出不同思維的程序員。Windows的程序員大多依賴集成開發(fā)環(huán)境,比如Visual Studio,而Unix程序員更加鐘愛Makefile與控制臺(tái)。顯而易見,集成開發(fā)環(huán)境更容易上手,在Windows上學(xué)習(xí)C語言,只需要會(huì)按幾個(gè)基本的Visutal C++工具欄按鈕就可以開始寫Hello, World!了,而在Unix下,你需要一些控制臺(tái)操作的基本知識(shí)。有人也許認(rèn)為Unix的環(huán)境更簡潔,但習(xí)慣的力量是很大的,大家都很熟悉Windows的基本操作,而為了學(xué)習(xí)C語言去專門裝一個(gè)Unix系統(tǒng),似乎有點(diǎn)不劃算。
對(duì)于一個(gè)只懂得Windows基本操作、連DOS是什么都不知道的新手而言,盡快做一些有趣而有意義的事情才是最重要的。用C語言寫一個(gè)小程序遠(yuǎn)比學(xué)習(xí)ls、cat等命令有趣,況且我們要專注于C語言本身,就不得不暫時(shí)忽略一些東西,比如編譯鏈接的過程、Makefile的寫法等等等等。
所以我建議初學(xué)者應(yīng)該以Visual C++ 6.0(不是VisualC++.NET)或者Dev C++作為主要的學(xué)習(xí)環(huán)境,而且千萬不要在IDE的使用技巧上過多糾纏,因?yàn)榻窈竽阋欢ㄒD(zhuǎn)向Unix環(huán)境的。Visual C++ 6.0使用很方便,調(diào)試也很直觀,但其默認(rèn)的編譯器對(duì)C標(biāo)準(zhǔn)的支持并不好,而Dev C++使用gcc編譯器,對(duì)C99的標(biāo)準(zhǔn)都支持良好。使用順帶提一下,很多大學(xué)的C語言課程還在使用Turbo C 2.0作為實(shí)驗(yàn)環(huán)境,這是相當(dāng)不可取的,原因其一是TC 2.0對(duì)C標(biāo)準(zhǔn)幾乎沒有支持,其二是TC 2.0編譯得到的程序是16位的,這對(duì)今后理解32位的程序會(huì)造成極大的困擾(當(dāng)然,用djgpp之類的東西可以使TC 2.0編譯出32位程序,不過那過于復(fù)雜了)。
等你學(xué)完一本C語言的教材,你一定要轉(zhuǎn)向Unix平臺(tái)繼續(xù)學(xué)習(xí),幾乎所有的C語言高級(jí)教程都是基于Unix平臺(tái)的(比如《C專家編程》)。轉(zhuǎn)變的過程是痛苦的,你需要面對(duì)的是各種紛繁復(fù)雜的命令,完全不同于Windows平臺(tái)的思考方式,但是這種痛苦是值得的。Unix與C是共生的,Unix的思考方式和習(xí)慣更加符合C語言的思考方式和習(xí)慣。在Unix下,你可以找到無數(shù)優(yōu)秀的源代碼供你盡情閱讀,你可以方便地查看某個(gè)庫函數(shù)的聯(lián)機(jī)手冊(cè),還可以看到最優(yōu)秀的代碼風(fēng)格
歸結(jié)起來就是一句話:初學(xué)C語言,建議使用Windows系統(tǒng)和集成開發(fā)環(huán)境,在準(zhǔn)備向“高手”方向努力時(shí),請(qǐng)先轉(zhuǎn)向Unix平臺(tái)。
三、萬事俱備,你就是東風(fēng)
書已選定,環(huán)境配置完成,正所謂萬事俱備,只欠你自己的努力了。請(qǐng)從書的前言開始,仔細(xì)地閱讀手頭的教材,很多人看書喜歡直接從第一章開始看,這是錯(cuò)誤的做法。前言是作者對(duì)整本書的大體介紹,作者一般會(huì)告訴你需要什么基礎(chǔ)才能夠順利閱讀本書,這可以幫助你檢驗(yàn)自己的基礎(chǔ)知識(shí)是否已經(jīng)具備??赐昵把?,還要瀏覽一下目錄,了解一下書的整體結(jié)構(gòu),順便給自己安排一下學(xué)習(xí)計(jì)劃。
學(xué)習(xí)C語言,必需注意每一個(gè)細(xì)節(jié),書上的例子代碼一定要自己親自敲一遍,編譯執(zhí)行輸出都跟書上說的一致才能算是學(xué)完了一個(gè)例子,如果不一致,就要仔細(xì)找原因。出了書本上有的例子,自己還要“創(chuàng)造”一些例子,比如學(xué)習(xí)運(yùn)算符優(yōu)先級(jí)的時(shí)候,可以寫幾個(gè)相同的表達(dá)式,在不同的位置加上括號(hào),看看有哪些不同的行為,比如*p++和(*p)++,又比如a = b == c、(a = b)== c和a =(b == c)等等。自己抄的書上的例子以及改造之后的例子,還有自己“創(chuàng)造”的例子,都應(yīng)該仔細(xì)地歸類保存,并且要在源代碼中寫上簡短的注釋,闡述這個(gè)例子的意圖。
例子之后就是習(xí)題了,我建議初學(xué)者把所有的習(xí)題都獨(dú)立做一遍,然后對(duì)照答案的代碼,看看自己的代碼有那些不足,再試著修改自己的代碼。很多人不重視習(xí)題,這是極大的錯(cuò)誤,因?yàn)樽髡咄ǔ?huì)在習(xí)題中說明一些重要的道理,而不是單純地檢驗(yàn)前面的知識(shí)。
也許你認(rèn)為這樣學(xué)習(xí)太慢,其實(shí)不然。學(xué)得細(xì)致就不用走回頭路,等你學(xué)到后面才發(fā)現(xiàn)自己前面沒搞清楚,那才是真的得不償失。一般說來,整本書讀完,你應(yīng)該完成數(shù)千行乃至上萬行的代碼,無論是原封不動(dòng)照抄書上的,還是自己心血來潮寫就的,都是今后繼續(xù)學(xué)習(xí)的一筆財(cái)富。以我自己舉例,閱讀《Windows核心編程》時(shí)(我只閱讀了3/4的內(nèi)容),除了抄書上的代碼,還自己寫了很多例子,一共有5574行(用unix下的wc工具統(tǒng)計(jì)),時(shí)隔多日,我早已記不清Windows的系統(tǒng)編程了,但只要花幾分鐘翻出以前的代碼看看,便會(huì)重新了然于胸。所謂好記性不如爛筆頭,就是這個(gè)道理。
仔細(xì)讀書、認(rèn)真抄寫源代碼、獨(dú)立完成習(xí)題外加更進(jìn)一步的實(shí)驗(yàn),最后將所有的代碼留下,成為自己的經(jīng)驗(yàn)和財(cái)富,絕對(duì)的辛苦,也絕對(duì)的事半功倍。當(dāng)然,這種方式只適合學(xué)習(xí)需要精通的技術(shù),如果不是學(xué)習(xí)C語言,你還要具體情況具體分析。
寫到最后,還有非常非常重要的一點(diǎn)沒有提及──代碼風(fēng)格,從最開始學(xué)習(xí)就必須強(qiáng)迫自己模仿最優(yōu)秀的代碼風(fēng)格。
第四篇:怎樣學(xué)好c語言
C語言
C語言,是一種通用的、過程式的編程語言,廣泛用于系統(tǒng)與應(yīng)用軟件的開發(fā)。具有高效、靈活、功能豐富、表達(dá)力強(qiáng)和較高的移植性等特點(diǎn),在程序員中備受青睞。C語言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)于1970年 由 肯·湯普遜(Ken Thompson)所研制出的B語言的基礎(chǔ)上發(fā)展和完善起來的。目前,C語言編譯器普遍存在于各種不同的操作系統(tǒng)中,例如UNIX、MS-DOS、Microsoft Windows及Linux等。C語言的設(shè)計(jì)影響了許多后來的編程語言,例如C++、Objective-C、Java、C#等。后來于1980年代,為了避免各開發(fā)廠商用的C語言語法產(chǎn)生差異,由美國國家標(biāo)準(zhǔn)局(American National Standard Institution)為C語言訂定了一套完整的國際標(biāo)準(zhǔn)語法,稱為ANSI C,作為C語言的標(biāo)準(zhǔn)。1980年代至今的有關(guān)程式開發(fā)工具,一般都支持符合ANSI C的語言
那怎樣才能學(xué)好C語言呢?
第一:C語言語法結(jié)構(gòu)很簡潔精妙,寫出的程序也很高效,很便于描述算法,大多數(shù)的程序員愿意使用C語言去描述算法本身,所以,如果你想在程序設(shè)計(jì)方面有所建樹,就必須去學(xué)它。
第二:C語言能夠讓你深入系統(tǒng)底層,你知道的操作系統(tǒng),哪一個(gè)不是C語言寫的?所有的indows, Unix, Linux, Mac, os/2,沒有一個(gè)里外的,如果你不懂C語言,怎么可能深入到這些操作系統(tǒng)當(dāng)中去呢?更不要說你去寫它們的內(nèi)核程序了。
第三:很多新型的語言都是衍生自C語言,C++,Java,C#,J#,perl...哪個(gè)不是呢?掌握了C語言,可以說你就掌握了很多門語言,經(jīng)過簡單的學(xué)習(xí),你就可以用這些新型的語言去開發(fā)了,這個(gè)再一次驗(yàn)證了C語言是程序設(shè)計(jì)的重要基礎(chǔ)。還有啊,多說一點(diǎn):即使現(xiàn)在招聘程序員,考試都是考C語言,你想加入it行業(yè),那么就一定要掌握好C語言。
那么究竟怎樣學(xué)習(xí)C語言呢?
1:工欲善其事,必先利其器
這里介紹幾個(gè)學(xué)習(xí)C語言必備的東東:
一個(gè)開發(fā)環(huán)境,例如turbo C 2.0,這個(gè)曾經(jīng)占據(jù)了DOS時(shí)代開發(fā)程序的大半個(gè)江山。但是現(xiàn)在windows時(shí)代,用turbo C有感覺不方面,編輯程序起來很吃力,并且拖放,更沒有函數(shù)變量自動(dòng)感應(yīng)功能,查詢參考資料也不方便。建議使用Visual C++,這個(gè)東西雖然比較大塊頭,但是一旦安裝好了,用起來很方便。
一本學(xué)習(xí)教程,現(xiàn)在C語言教材多如牛毛,但推薦大家使用《C語言程序設(shè)計(jì)》譚浩強(qiáng)主編 第二版 清華大學(xué)出版社,此書編寫的很適合初學(xué)者,并且內(nèi)容也很精到。除此以外,現(xiàn)在有很多輔助學(xué)習(xí)的軟件,畢竟現(xiàn)在是Window時(shí)代了,學(xué)習(xí)軟件多如牛毛,不象我們當(dāng)初學(xué)習(xí),只有讀書做題這么老套。我向大家推薦一個(gè)“集成學(xué)習(xí)環(huán)境(C語言)”,里邊的知識(shí)點(diǎn)總結(jié)和例程講解都非常好,還有題庫測(cè)試環(huán)境,據(jù)說有好幾千題,甚至還有一個(gè)windows下的trubo C,初學(xué)者甚至不用裝其它的編譯器,就可以練習(xí)編程了,非常適合初學(xué)者。還有一個(gè)“C語言學(xué)習(xí)系統(tǒng)”軟件,不過感覺只是一個(gè)題庫系統(tǒng),如果你覺得題做的不夠,不妨也可以試試。
2:葵花寶典
學(xué)習(xí)計(jì)算機(jī)語言最好的方法是什么?答曰:讀程序。
沒錯(cuò),讀程序是學(xué)習(xí)C語言入門最快,也是最好的方法。如同我,現(xiàn)在學(xué)習(xí)新的J#,C#等其他語言,不再是抱著書本逐行啃,而是學(xué)習(xí)它們的例程。當(dāng)然,對(duì)于沒有學(xué)過任何計(jì)算機(jī)語言的初學(xué)者,最好還是先閱讀教程,學(xué)習(xí)完每一章,都要認(rèn)真體會(huì)這一章的所有概念,然后不放過這一章中提到的所有例程,然后仔細(xì)研讀程序,直到每一行都理解了,然后找?guī)讉€(gè)編程題目,最好是和例程類似的或一樣的,自己試圖寫出這段已經(jīng)讀懂的程序,不要以為例程你已經(jīng)讀懂了,你就可以寫出和它一樣的程序,絕對(duì)不一定,不相信你就試一試吧,如果寫不出來,也不要著急,回過頭來再繼續(xù)研究例程,想想自己為什么寫不出來,然后再去寫這段程序,反反復(fù)復(fù),直到你手到擒來為止,祝賀你,你快入門了。
3:登峰造極
寫程序的最高境界其實(shí)就是掌握各種解決問題的手段(數(shù)據(jù)結(jié)構(gòu))和解決問題的方法(算法)。
是不是寫出底層程序就是程序設(shè)計(jì)高手呢?非也,寫底層程序,無非是掌握了硬件的結(jié)構(gòu),況且硬件和硬件還不一樣,要給一個(gè)芯片寫驅(qū)動(dòng)程序,無非就是掌握這塊芯片的各種寄存器及其組合,然后寫值讀值,僅此而已。這不過是熟悉一些io函數(shù)罷了。那么怎樣才算精通程序設(shè)計(jì)呢?怎樣才能精通程序設(shè)計(jì)呢?舉個(gè)例子:你面前有10個(gè)人,找出一個(gè)叫“張三”的人,你該怎么辦?第一種方法:直接對(duì)這10個(gè)人問:“誰叫張三”。第2種方法:你挨個(gè)去問“你是不是張三?”,直到問到的這個(gè)人就是張三。第三種方法:你去挨個(gè)問一個(gè)人“你認(rèn)不認(rèn)識(shí)張三,指給我看”。不要小看這個(gè)問題,你說當(dāng)然會(huì)選第一種方法,沒錯(cuò)恭喜你答對(duì)了,因?yàn)檫@個(gè)方法最快,效率最高,但是在程序設(shè)計(jì)中找到解決問題的最優(yōu)方法和你用的手段卻是考驗(yàn)一個(gè)程序員程序設(shè)計(jì)水平的重要標(biāo)志,而且是不容易達(dá)到的。剛才這個(gè)問題類似于數(shù)據(jù)結(jié)構(gòu)和算法中的:Map數(shù)據(jù)結(jié)構(gòu),窮舉查找和折半查找。所以掌握好數(shù)據(jù)結(jié)構(gòu)和一些常用算法,是登峰造極的必然之路。最后給大家推薦嚴(yán)尉敏的《數(shù)據(jù)結(jié)構(gòu)》清華大學(xué)出版社,希望每一個(gè)想成為程序設(shè)計(jì)高手的人研讀此書。
這里有簡單的C程序介紹
為了說明C語言源程序結(jié)構(gòu)的特點(diǎn),先看以下幾個(gè)程序。這幾個(gè)程序由簡到難,表現(xiàn)了C語言源程序在組成結(jié)構(gòu)上的特點(diǎn)。雖然有關(guān)內(nèi)容還未介紹,但可從這些例子中了解到組成一個(gè)C源程序的基本部分和書寫格式。
【例1.1】
main(){
printf(“世界,您好!n”);}
l
main是主函數(shù)的函數(shù)名,表示這是一個(gè)主函數(shù)。
l
每一個(gè)C源程序都必須有,且只能有一個(gè)主函數(shù)(main函數(shù))。
l
函數(shù)調(diào)用語句,printf函數(shù)的功能是把要輸出的內(nèi)容送到顯示器去顯示。
l printf函數(shù)是一個(gè)由系統(tǒng)定義的標(biāo)準(zhǔn)函數(shù),可在程序中直接調(diào)用。C語言常用指令 1.I/O函數(shù)
(1)scan f函數(shù):
int scanf(const char *format…..);
從標(biāo)準(zhǔn)輸入流stdin中按格式format將數(shù)據(jù)寫到參數(shù)表中;若操作成功,返回寫到參數(shù)表中的參數(shù)個(gè)數(shù),否則返回EOF;
(2)printf 函數(shù):
int printf(const char *format,...);printf()函數(shù)根據(jù)format(格式)給出的格式打印輸出到STDOUT(標(biāo)準(zhǔn)輸出)和其它參數(shù)中.2.數(shù)學(xué)函數(shù)(1)求絕對(duì)值
double fabs(double);int abs(int);
(2)floor函數(shù):返回不大于參數(shù)的整數(shù)
float floor(float);
(3)ceil函數(shù):返回不小于參數(shù)的整數(shù)
float ceil(float);
(4)pow:返回X^Y;
double pow(double x,double y);
(5)sqrt:返回x的開方 double sqrt(double x);
(6)log2,log10:返回底數(shù)的自然對(duì)數(shù)值
double log2(double x);double log10(double x);
3.字符串處理函數(shù)
(1)char *strchr(const char *str,int ch);
返回str中第一次出現(xiàn)字符ch的位置指針,否則返回NULL;
(2)char *strstr(const char *str1,const char *str2);
返回str1中第一次出現(xiàn)str2的位置指針,否則返回NULL;
(3)int stricmp(const char *str1,const char *str2);
忽略字符的大小寫進(jìn)行比較
(4)int strncmp(const char *str1,const char *str2,int count);
將str1前n個(gè)字符與str2的前n個(gè)字符進(jìn)行比較
(5)char *strncpy(char *str1,const char *str2,int count);
將str2的前n個(gè)字符復(fù)制到str1中
(6)char *strrev(char *str);
將字符串str逆序,并返回逆置后的結(jié)果
4.常用使用函數(shù)
(1)double atof(const char *str);
將字符串str表示的數(shù)轉(zhuǎn)換成浮點(diǎn)數(shù)
(2)int atoi(const char *str);將字符串str表示的數(shù)轉(zhuǎn)換成整數(shù)
請(qǐng)理解以下知識(shí): #include 包含頭文件
#if 條件
#else 否則
#elif 否則如果
#endif 結(jié)束條件
#ifdef 或 #if defined 如果定義了一個(gè)符號(hào), 就執(zhí)行操作
#ifndef 或 #if!defined 如果沒有定義一個(gè)符號(hào), 就指執(zhí)行操作
#define 定義一個(gè)符號(hào)
#undef 刪除一個(gè)符號(hào)
#line 重新定義當(dāng)前行號(hào)和文件名
#error 輸出編譯錯(cuò)誤 消息, 停止編譯
#pragma 提供 機(jī)器專用的特性,同時(shí)保證與C++的完全兼容
這些是預(yù)處理的命令,只能你理解的不是很全,有時(shí)別的文件已經(jīng)編譯過了,我們不需要再編譯一次,因?yàn)槟鞘呛芡纯嗟?,所以為了效率,我們就可以用預(yù)處理的方法來搞定,處理過的不處理,沒處理過的搞定它 | 評(píng)論
第五篇:程序員教你學(xué)C語言
程序員教你學(xué)C語言
很多小伙伴都老是會(huì)碰到疑問,其實(shí)還是基礎(chǔ)沒打扎實(shí),這些題如果你不看答案你能知道多少呢?如果還有很多不知道就證明基礎(chǔ)沒打扎實(shí),如果你還在入門糾結(jié),如果你還在苦惱怎么入門!小編有個(gè)建議,可以加小編弄的一個(gè)C語言交流基地,大家可以進(jìn)入交流基地:565122788,里面新手入門資料,可以說從零到項(xiàng)目實(shí)戰(zhàn),都是可以免費(fèi)獲取的,還有程序員大牛為各位免費(fèi)解答問題,熱心腸的小伙伴也是蠻多的。不失為是一個(gè)交流的的好地方,小編在這里邀請(qǐng)大家加入我的大家庭。歡迎你的到來。一起交流學(xué)習(xí)!共同進(jìn)步!小編等你!還有前面沒有看的同學(xué)最好從程序員教你學(xué)C語言
(一)開始看哦,尤其是基礎(chǔ)還沒打扎實(shí)的同學(xué)!
今天只舉幾個(gè)例子,主要幫大家鞏固循環(huán)的知識(shí),每個(gè)例子大家都要敲鍵盤敲出來,然后運(yùn)行成功了才算掌握了,不然還是眼高手低,看上去懂了,一到寫程序又犯難了。我發(fā)現(xiàn)有不少人熱衷于打印圖形,所以就弄了幾個(gè)圖形。第一個(gè)是打印金字塔。代碼和運(yùn)行圖如下:
首先定義了兩個(gè)變量i、j,然后使用system(“color 0e”)改變顏色。接下來會(huì)進(jìn)入一個(gè)外層循環(huán),其中的i代表層數(shù),我們可以看到這里金字塔有6層,所以i的取值范圍也是0<=i<6,第一次進(jìn)循環(huán)時(shí),i=0,然后到第一個(gè)內(nèi)層循環(huán),這個(gè)循環(huán)的初始條件是j=6-i=6,結(jié)束條件是j>0,所以這里會(huì)打印6個(gè)空格,然后來到第二個(gè)內(nèi)層循環(huán),這個(gè)循環(huán)的初始條件是j=1;結(jié)束條件是j<=2*i+1=1,所以這里會(huì)打印一個(gè)星,然后會(huì)以printf(“ ”)打印一個(gè)換行結(jié)束第一次外層循環(huán),然后開始第二次外層循環(huán),如此反復(fù),最后就得到了如上所示的圖形。
不理解的話可以把外層循環(huán)for(i = 0;i < 6;i++)的i<6改成i<3,這樣就只會(huì)打印三行,可以便于理解。
第二個(gè)是打印菱形,其實(shí)就是上一個(gè)圖形的變化,效果和代碼如下:
可以看到,我們這個(gè)圖形是上下對(duì)稱的,所以打印菱形上半部分(就是上一個(gè)例子的打印金字塔)的代碼和下半部分的代碼十分相似,只是把外層循環(huán)的頭部從for(i = 0;i < 6;i++)變成了for(i = 6;i >= 0;i--),大家理解一下代碼,菱形的上半部分,打印的星星數(shù)會(huì)越來越多,從1到3再到5再到7...而星星前面的空格數(shù)會(huì)越來越少,從6到5再到4再到3...而菱形的下半部分剛好反過來了,所以只需要修改很少的代碼就能實(shí)現(xiàn)菱形了
接下來是打印一個(gè)五角星,這是之前一個(gè)萌萌噠妹紙學(xué)習(xí)的代碼,因?yàn)槲冶容^懶啦,所以沒做修改就直接拿來了,希望不要介意 #include
這個(gè)程序很明顯分成了四塊,由四個(gè)外層for循環(huán)構(gòu)成,for(n1=1;n1<6;n1++)打印最上面5行,for(n2=1;n2<5;n2++)打印中間4行,for(n3=1;n3<3;n3++)打印下面2行行,for(n4=1;n4<5;n4++)打印最下面4行,大家自己理解下代碼,不懂的就問
最后一個(gè)圖形是我剛剛寫的六芒星,完整的代碼輸出結(jié)果是這樣的:
學(xué)習(xí)交流群(565122788)
但是我這里只給出一半代碼,剩下的需要大家自己學(xué)完成,當(dāng)是對(duì)自己的考驗(yàn)也好,作業(yè)也罷,還是希望大家能夠自己親自動(dòng)手試一下的。不懂的就再問 #include
更多的數(shù)據(jù)類型和循環(huán)
前面我們說為了讓計(jì)算機(jī)能夠識(shí)別一個(gè)變量到底占了多少字節(jié),我們需要為變量定義數(shù)據(jù)類型,那究竟有多少種數(shù)據(jù)類型呢,其實(shí)前面我給出32個(gè)關(guān)鍵字里面就已經(jīng)包括了,short、int、long、char、float、double這6個(gè)關(guān)鍵字代表了C語言里的6中基本數(shù)據(jù)類型,怎么去理解它們呢,舉個(gè)例子:大家都見過剪卡器吧?(沒見過?手機(jī)卡總見過吧)。我們知道不同的手機(jī)使用的手機(jī)卡的大小是有區(qū)別的,我們通常是用剪卡器,拿著它把原來移動(dòng)的大卡這么一咔,一個(gè)小卡就出來了,不同型號(hào)的剪卡器咔出來的手機(jī)卡大小不一樣,比如蘋果手機(jī)的卡就特別小,三星的卡稍微大點(diǎn)......,現(xiàn)在我們聯(lián)想一下,short、int、long、char、float、double這六個(gè)東東是不是很像不同類型的剪卡器?拿著它們?cè)趦?nèi)存上咔咔咔,不同大小的內(nèi)存就分配好了。在32位的系統(tǒng)下short咔出來的內(nèi)存大小是2個(gè)字節(jié)(也叫byte);int咔出來的內(nèi)存大小是4個(gè)byte;long咔出來的內(nèi)存大小是4個(gè)byte;float咔出來的內(nèi)存大小是4個(gè)byte;double咔出來的內(nèi)存大小是8個(gè)byte;char咔出來的內(nèi)存大小是1個(gè)byte。接下來我們就寫程序看看這些基本的數(shù)據(jù)類型在我們自己電腦上的大小吧。
其中sizeof關(guān)鍵字可以確定給定的類型占據(jù)了多少字節(jié),它后面可以直接跟類型的關(guān)鍵字,比如sizeof(int),也可以跟變量(比如sizeof(i))甚至是表達(dá)式,比如最后一行的sizeof(i-1),它的結(jié)果是表達(dá)式的計(jì)算結(jié)果所占據(jù)的字節(jié)數(shù),i-1的結(jié)果為0,0也是整數(shù),所以占據(jù)的字節(jié)數(shù)為4。(注意這里是指的32位的編譯環(huán)境下的情況,具體平臺(tái)大家可以運(yùn)行這個(gè)程序測(cè)試一下)。然后接下來是對(duì)這6種基本數(shù)據(jù)的使用情況
可以看到,兩組都是同樣的數(shù)據(jù),但是最后打印出來的結(jié)果,上面一組數(shù)據(jù)中字符變量、浮點(diǎn)變量和雙精度變量打印出來的結(jié)果都不對(duì)。原因是什么呢,因?yàn)槭莗rintf的第一個(gè)參數(shù),%d這個(gè)符號(hào),前面的%是占位符,后面的這個(gè)d代表是以整數(shù)形式打印出來,而不同的數(shù)據(jù)類型要以不同的形式打印出來,所以總結(jié)一下,%c表示打印字符、%f是打印浮點(diǎn)數(shù)、%lf是打印雙精度,%hd、%d、%ld分別是打印短整型、整型和長整型
關(guān)于上面的字符c='a'為什么按%d整數(shù)打印是97的問題,這個(gè)其實(shí)就涉及到ascii碼表了,我們知道在計(jì)算機(jī)底層,所有的數(shù)據(jù)都是以0和1存儲(chǔ)的,那計(jì)算機(jī)如何識(shí)別像a、b、c這樣的字符呢,其他它們最終在計(jì)算機(jī)里也是被以0、1數(shù)據(jù)的形式存放的,而且美國人就為它們指定了一個(gè)統(tǒng)一的標(biāo)準(zhǔn),就是ascii編碼,圖片如下
可以看到小寫字符a的ascii碼值的十進(jìn)制就是97,而大寫A的ascii碼是65,printf中的%d就是以十進(jìn)制整數(shù)方式輸出它在內(nèi)存中的數(shù)據(jù),所以就輸出了97 接下來將大家使用這些基本數(shù)據(jù)類型最容易犯錯(cuò)的一點(diǎn),就是極限值,我們知道計(jì)算機(jī)里的一位只能表示0或者1,而兩位只能表示0、1、2、3,依次類推,我們?nèi)绻蠳位,那也只能表示2的N次方個(gè)數(shù)據(jù),我們說int是4字節(jié)的,就是32位,所以int也是有極限值的,那是不是就是2的32次方呢,理論上來講,它能表示這么多的數(shù)據(jù),但是因?yàn)橛姓?fù)數(shù)的存在,這個(gè)值還得減半,我們接下來的程序就是測(cè)試你機(jī)器上的這些基本類型的極限值的,注意unsigned這個(gè)修飾符就是無符號(hào)的數(shù),比如unsigned int,這就是無符號(hào)整數(shù),這樣它能表示的范圍就是0~4294967295(2的32次方-1)了。不小心極限值的話,就會(huì)經(jīng)常犯錯(cuò)
C/C++學(xué)習(xí)交流群,歡迎大家一起來交流提升。565122788進(jìn)群就能獲取C語言新手學(xué)習(xí)大禮包
另外兩種循環(huán):while循環(huán)和do...while循環(huán)(還有一種可以構(gòu)成循環(huán)的是goto,但是先不講).while循環(huán)的格式: while(表達(dá)式){ 循環(huán)執(zhí)行語句;} 下一條語句;while循環(huán)和for循環(huán)的區(qū)別在于它的循環(huán)頭部沒有賦初值的操作,一開始就會(huì)進(jìn)行循環(huán)表達(dá)式的判斷,如果表達(dá)式成立,則進(jìn)入循環(huán),否則跳到循環(huán)的下一條語句。看一個(gè)例子 # include