|
這是一位同學(xué)寄到我郵箱里面的一封信。應(yīng)該說,這類C/C++入門學(xué)習(xí)的問題我回答過,只是并沒有很具體到某個平臺,某個語言,因此,我的回答可能給大家一種云里霧里的感覺,指導(dǎo)性不強(qiáng),因此,大家還是不斷問。我也只有不斷回答。
其實(shí)呢,這里面我自己也有一些苦衷。寫程序?qū)懙轿疫@么久,看很多問題都抽象了,大家覺得很多風(fēng)馬牛不相及的問題,在我看來,都是“一碼事”。
Windows和Linux操作系統(tǒng),甚至其他的操作系統(tǒng),我看起來,是“一碼事”。
VC和gcc,“一碼事”。
C和C++,“一碼事”。
匯編和高級語言,“一碼事”。
C++和Java,“一碼事”。
網(wǎng)絡(luò)傳輸和共享內(nèi)存,“一碼事”。
進(jìn)程和線程,“一碼事”。
進(jìn)程和服務(wù),“一碼事”。
......
甚至,我說個嚇人的,站在“堆”的角度,“棧”和“隊(duì)列”,也是“一碼事”。
大家能理解不?
因此,每次大家一問到我很具體的問題,我就頭大,n多的朋友,直接一段代碼甩到我QQ或者email里面,問肖老師,這段代碼為啥掛了?為啥有泄漏?我就快昏死過去了。呵呵。
我想這很好理解,大家剛剛開始接觸計(jì)算機(jī)軟件編程,從0(注意,不是O“偶”啊,呵呵)開始學(xué)習(xí),看到很多新奇的東東,也學(xué)到很多新想法,這些東東呢,目前還沒有串起來,都是零散的知識點(diǎn),因此,看問題“割裂”思維很嚴(yán)重,學(xué)東西也不透徹。問出問題來,目的性也很強(qiáng),搞得我很不好回答。
就好比下面這位同學(xué)的問題。
不過呢,我想這是正常的,我也是從這條路走過來的,這不算什么。其實(shí)軟件編程也就是一份工作啦,只要潛心鉆研進(jìn)去,好好學(xué)習(xí),慢慢的,工作做多了,看到的東東多了,見識廣了,也就自然而然能站在一個較高的角度,“俯視”這個專業(yè),那,自然很多東東,看起來就不難了。
我今天把這位朋友的信做個公開回答,我想,回答的問題其實(shí)并不重要,關(guān)鍵是,我希望大家能理解,如果能多學(xué)一點(diǎn)東東,以一種統(tǒng)攬的目光來看待問題,則很多問題,尤其是很多方向性問題,其實(shí)很容易解決的。
我想,這是一種思想,我寫文字,喜歡加點(diǎn)思想的東東進(jìn)去,好比我的書《0bug-C/C++商用工程之道》一樣,大家都說這是一本程序書,其實(shí),我這個作者說不是的。我真正想講的內(nèi)容,其實(shí)在第一章,如何讓程序員掌握商用化開發(fā)和工程化開發(fā)的思想,能理解這個,其實(shí),后面的內(nèi)容我認(rèn)為都不必細(xì)看的,因?yàn)樽约河龅絾栴},都能提出解決方案,何苦來照抄我的?
技術(shù)是不值錢的,思想值錢。起碼我這么認(rèn)為。
好,言歸正傳,我們看看這位同學(xué)的來信,嗯,還是那句話哈,一家之言,歡迎拍磚,呵呵,別忘了。
原文如下:
肖老師:
你好,最近也許你很忙吧?不過我還是很榮幸,你看到我的信了。我的名字叫陳XX,在廣西桂林電子科技大學(xué)學(xué)習(xí),專業(yè)是信息與計(jì)算科學(xué);我今年是大二的學(xué)生了,而且馬上進(jìn)入大三了。今天是周未,在大學(xué)生大本營中找到了你的郵箱地址。其實(shí)我很想與你寫信了,只是沒有找到你的郵箱地址啊!今天有幸看到《我們“憑什么”找工作?》這文章后有個你的郵箱和QQ。
還是開門見山吧,其實(shí)我也很想成為一名程序員,不僅這個職業(yè)可以賺錢,而且我也越發(fā)現(xiàn)我喜歡上了這個職業(yè)。因?yàn)槲覀冊诖笠粚W(xué)了C和C++。我覺得很上手。可是我還是很迷惘??!怎么說呢?因?yàn)槲覀儗W(xué)了上面的那兩和計(jì)算機(jī)語言。我就從上學(xué)期開始學(xué)MFC,還有相關(guān)的 WinAPI??墒俏矣X得好難了。學(xué)了那么久了我覺得沒有什么進(jìn)展的。很亂。我現(xiàn)在我覺得我選擇了這個,我還是想堅(jiān)持下去,但是又很猶豫,一來因?yàn)槲业臄?shù)學(xué)不好,聽說做程序員的話要有比較好的數(shù)學(xué)功底才行,是不是這樣的一種情況呢?期待你的回答一下!
第二,我學(xué)習(xí)Windows下編程,MFC,要從哪里下手,應(yīng)該怎么學(xué)才能夠有很好的進(jìn)步呢?
第三,我們是信息與計(jì)算科學(xué)專業(yè),我們得知這個專業(yè)的學(xué)生就業(yè)不是很好,你覺得在這個專業(yè)里我們?nèi)绾伟才攀O碌臅r間才對呢?我們該向哪方面發(fā)展呢?
我是個農(nóng)村出來的孩子,不怎么懂得說話,今天能夠遇到你的確是我的榮幸??!很期待你的回復(fù),在此先謝謝你了。
陳XX
2010年3月13日
我的回答:
要我說,不管學(xué)C還是學(xué)C++,VC和gcc都可以,甚至,什么其他C語言編譯器,也可以啊,Intel的C,以前DOS下的 turboC/C++,WatcomC/C++,都可以,我首先擺句話,C和C++是語言,既然是語言,就與操作系統(tǒng)無關(guān),那些 printf,scanf,甚至包括什么對話框,MassageBox,消息循環(huán),都不重要,因?yàn)檫@不是語言特性,初學(xué)者,暫時先不必管。
其實(shí)學(xué)語言,東西不多的。C語言里面,常用的就那么一些語句,嗯,幾乎所有的語言,都只有那么些語句。你要有判斷語句吧,分支是程序設(shè)計(jì)很重要的,那if...else結(jié)構(gòu)要學(xué)習(xí)一下。循環(huán),計(jì)算機(jī)里面主要就是循環(huán),while,for,得學(xué)習(xí)吧。要有變量,則必然有賦值語句,與之對應(yīng),有了變量就有了常量,那么,#define的宏定義,const常量宣告,要學(xué)一點(diǎn)。加減乘除基本四則計(jì)算要會吧,大家學(xué)計(jì)算機(jī)專業(yè),什么邏輯運(yùn)算符要會吧?
程序要分段,每段呢,Basic叫子程序,或者模塊,C里面叫函數(shù),其他語言各有叫法,其實(shí)都是一碼事啦。既然有了函數(shù),或者子程序,“跳子”動作要理解吧,或者Call函數(shù)的動作要理解吧?就是我從主程序跳到一個子模塊執(zhí)行,執(zhí)行完畢后會自動返回到調(diào)用處,繼續(xù)執(zhí)行主程序,這個好理解吧?
然后呢?沒啦!
真沒啦,熟練掌握上面的基本語句,你什么語言其實(shí)都可以寫程序的。大家說對不?Basic,匯編,C,等等,各種語言,在編制執(zhí)行流程這部分,又有多大差別?
然后呢?學(xué)一點(diǎn)指針,C語言最拽的就是指針,沒指針,C就變Basic了,呵呵。
學(xué)指針,我給個新鮮點(diǎn)的建議,大家不妨試試。很多人站在高級語言的角度,理解指針確實(shí)困難,什么嘛,指來指去的,腦子都亂了。
ok,我建議大家學(xué)習(xí)一點(diǎn)匯編語言,這方面書也很好找的,站在匯編角度去理解指針,一下就能理解,因?yàn)閰R編里面全是指針計(jì)算,你調(diào)入寄存器的值,是通過一個單元號來表示的,這就是指針。大家只要用匯編實(shí)現(xiàn)一個鏈表,嗯,再多實(shí)現(xiàn)一個樹,我想,指針怎么玩,再怎么都會了。有興趣的朋友,不妨試試。
然后呢?呵呵,C學(xué)習(xí)完了,起碼我認(rèn)為是這樣。
講到這里,大家肯定罵聲一片,姓肖的這個江湖騙子,又在騙人了(某位網(wǎng)友送我的,呵呵),每本學(xué)習(xí)C語言的書,第一課,Hello World,你都不講,printf都不教,你這C語言就學(xué)完了?退學(xué)費(fèi)!哦,肖老師沒收我學(xué)費(fèi),沒得退-_-
嗯,確實(shí),如果大家要我講C語言,我是不講Hello World的,printf,是操作系統(tǒng)的東東哦,不屬于語言規(guī)范。因?yàn)樗婕拜斎胼敵隽骺刂?,而流這個概念,其實(shí)是操作系統(tǒng)提供給各種語言的通用控制臺功能。不屬于語言范疇。
另外,不是每個操作系統(tǒng)都提供printf哦,Windows的窗口模式下,你用printf試試看,能不能打出東東來因此,我說句話,凡是和具體平臺綁定的東東,其實(shí)通用性并沒有保障,學(xué)語言,學(xué)抽象,先學(xué)通用的東東好一點(diǎn)。
ok,我們再來看C++,嗯,C++博大精深,我這輩子是沒有學(xué)完的,我想,這個世界上恐怕也很少有程序員,寫程序曾經(jīng)把C++的每一個特性都用一遍。那怎么學(xué)?
我的回答是,學(xué)到夠用為止。
C++,最重要的是面向?qū)ο蟮乃枷耄蚁?,學(xué)會這個,比什么都重要。我們學(xué)C的編程,一件事情,先做什么,后做什么,起碼,我們是講得清楚的,也能寫出程序流程,這種分先后次序做事情的方法,是典型的面向過程。
面向?qū)ο笤诂F(xiàn)代程序開發(fā)中很重要,大型工程,功能模塊太多,每個組織工具,全部然到一起,會亂的,bug也不好控制。因此,用對象,把一堆數(shù)據(jù),以及它所有可能的操作方法,集合到一起,到哪都不會丟三落四的,這樣寫的代碼,質(zhì)量高,效率也不錯,是個好的開發(fā)習(xí)慣。
其實(shí)面向?qū)ο蠛芎唵危?jì)算機(jī)里面,做來做去都是計(jì)算,對不對?既然是計(jì)算,就少不了數(shù)據(jù),因此,數(shù)據(jù)必有其特性啊,那么,我們寫的函數(shù)模塊,可能適合這類數(shù)據(jù),不適合那類數(shù)據(jù),我們用對象把函數(shù)和它適合處理的數(shù)據(jù),全部綁到一起,大家調(diào)用起來方便嘛。就這么簡單。
還有個命名空間問題,這是C++的創(chuàng)造發(fā)明,同樣一個AddData,向一個集合里面加數(shù)據(jù),給隊(duì)列加的算法和給棧加的算法,就肯定不一樣,亂用就要出錯。C呢,命名上不容易區(qū)分,現(xiàn)在到了C++,“隊(duì)列.AddData()”和“棧.AddData”,大家看看,是不是一目了然?命名空間就是讓程序員好看不發(fā)昏的工具嘛。
理解了對象,那自然理解類,類是對象的程序描述,對象則是類程序在運(yùn)行期,內(nèi)存中實(shí)例化出來的一個具體有生命的程序工作段,一個類可以實(shí)例化一個對象,也可以實(shí)例化多個,各有其私有變量區(qū),互相不然,同樣一個“人”這個類,我們可以實(shí)例化出張三李四王二麻子三個對象,都是合理的,理解不?
模板就不多說了吧,其實(shí)就是“類的類”,模板沒有界定類的一些特性,比如數(shù)據(jù)類型,那么,哪天我們把int貼合到一個模板上,可以得到一個int類,float也可以得到float類,再進(jìn)一步實(shí)例化為int類對象和float類對象,就這么簡單。大家不用想復(fù)雜了。
C++理解到這里,我認(rèn)為就夠了,剩下的,工作中有用到,邊看邊學(xué)啦,最核心的理念已經(jīng)掌握了。
有一個重點(diǎn),幾乎所有的C++編譯器,其實(shí)都是兼容C和C++的,嗯,還有內(nèi)嵌式匯編。那,寫程序有必要分得那么開嗎?C++到函數(shù)內(nèi)部,不就是C啦,C呢,我用函數(shù)指針+結(jié)構(gòu)體,一樣可以實(shí)現(xiàn)對象的。這個世界正式因?yàn)橛辛诉@種復(fù)雜性和多樣性,才多姿多彩的。
所以,建議大家寫程序的時候,哪個語言合用用哪個,別形而上學(xué),別鉆牛角尖,什么語言都是假的,寫出程序來賣錢是真的,大家說是不是?
ok啦,我們終于可以回到這位同學(xué)的問題,咋從VC開始,用MFC寫Windows程序?
很簡單,按上面的流程走一遍,C和C++基本知識都不熟,上來就學(xué)windows開發(fā),還要理解MFC,沒有學(xué)會走,就想跑,會摔跟斗的。
學(xué)完上面的,要去看看Windows程序設(shè)計(jì)這本書,很經(jīng)典的,這里面啊,沒怎么講MFC,但是,講了使用WinMain方式寫Windows程序的辦法,其實(shí),這更符合傳統(tǒng)的C和C++,都要有個main才能開始運(yùn)行吧。
不理解WinMain,上來就跑MFC,我敢說,你連你的程序從哪開始運(yùn)行的都找不到。
WinMain很好理解的,上來先CteateWindowEx,就是創(chuàng)建一個窗口,這個函數(shù)巨復(fù)雜,不要背,我每次都是從別人代碼里面拷貝一個過來,自己改吧改吧,窗口就出來了。
最重要的來了哈,Windows程序都是基于一個事件隊(duì)列在工作,也叫消息隊(duì)列,深刻理解消息隊(duì)列循環(huán),要知道,每個窗口一出來,Windows系統(tǒng)就友情贈送了一個消息隊(duì)列服務(wù)給你,你按的鍵盤,點(diǎn)的鼠標(biāo),還有其他一些什么事件,都自動放到這個隊(duì)列中,我們程序的任務(wù),就是建立一個死循環(huán),不斷從隊(duì)列中彈出消息來處理就好了,至于有多少種消息,我告訴你,無數(shù)種,因?yàn)榭梢宰远x,簡單看看Windows常用幾個,剩下的,以后碰到再查啦。
嗯,還是要給大家一個printf嘛,不然,大家想打點(diǎn)字符都打不出來,也太沒面子了,去查查AfxMessageBox這個函數(shù),暫時應(yīng)該夠用了,再不然,去看看GDI里面的TextOut,是不是這個哦?好久沒用,記不清了。實(shí)在不行,VC下有個通用的,TRACE,這是打印到VC開發(fā)環(huán)境,就是IDE的Out窗口的,和printf用法一樣,夠了吧?
當(dāng)我們把這些東東理解了,去看看侯捷先生的《深入淺出MFC》,怎么從WinMain思想一下跳到MFC的框架思想,看完前三章就回了,后面幾章我都沒怎么看,也夠用了,呵呵。
有個提示,去找本W(wǎng)in32API手冊,這個一般Windows開發(fā)是必備的,系統(tǒng)提供什么功能函數(shù),基本上都有,這中間要理解Handle的概念,句柄,很費(fèi)解的,我當(dāng)初也是很久都沒有理解到,直到有一天,有個大蝦一句話把我點(diǎn)醒了,“你把它當(dāng)窗口的指針看好了!”,明白了吧,C和C++中,指針代表一切,什么都可以指針表示,你就把Handle看做指針好了,就是一個窗口,一個資源,在系統(tǒng)中的唯一標(biāo)示符,一個ID,一個指針。
再提示一點(diǎn),Win32API的函數(shù),MFC中基本上都有同名的對應(yīng)函數(shù),很多時候,看熟悉了,猜都猜得出MFC下一個對象,可能有哪些公有方法的。反過來也一樣,MFC熟了,可以逆推Wind32API里面有啥函數(shù)。
and。。。沒啦!
又沒啦,使用VC,利用MFC開發(fā)Windows程序,把上面路程走一遍,就差不多了,要是書買的齊全,我覺得,三個月足以了,沒必要花太多時間。
當(dāng)然,這樣開發(fā)商用工程還是不夠的,得大量的學(xué)習(xí)其他相關(guān)知識。
我們開發(fā)非模態(tài)窗口,要理解線程的,要理解并行開發(fā),那就要理解鎖了,這個呢,是所有多任務(wù)操作系統(tǒng)都必須學(xué)習(xí)的開發(fā)知識,要想學(xué)習(xí)這個,我推薦我的書《0bug-C/C++商用工程之道》,第六章以后全在講這些知識,并行開發(fā)的知識。
我們開發(fā)圖形應(yīng)用,要理解GUI,GDI對象,DirectX,這些都有專門的書,用了就學(xué),不用就不學(xué)。
網(wǎng)絡(luò)估計(jì)是大家都少不了的,現(xiàn)在的話是,不懂TCP/IP開發(fā),就不要學(xué)著別人出來闖江湖,呵呵,不過呢,學(xué)TCP最好的書不是Windows 的,有本《Unix網(wǎng)絡(luò)編程》,第一卷和第二卷,經(jīng)典到了極點(diǎn),建議看看,看了,什么Windows,Linux,都是一碼事。呵呵。
然后呢?
然后我話講完,洗洗睡了^_^
it知識庫:我們?nèi)绾螐腣C++開始“編程”?,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。