- C/C++實踐進(jìn)階之道:寫給程序員看的編程書
- 陳黎娟
- 2928字
- 2020-06-29 11:37:36
1-1 閉上眼睛細(xì)數(shù)C語言的特點
既然本書的定位是讀者的第二本C語言類圖書。那么,我們合上圖書,簡單來聊聊C語言的特點,也算是對C語言的簡單總結(jié),為后面的學(xué)習(xí)打下良好的基礎(chǔ)。
C語言精巧
相比現(xiàn)在比較大眾化的、流行的C++,Java和C#,C語言實在是太小巧了。它的關(guān)鍵字少,語法簡單,生成機(jī)器代碼的效率和匯編語言差不多,所以成為底層開發(fā)人員的最愛。
這也是C語言生命力如此強(qiáng)大的重要原因。
另外,因為C語言的簡潔,基本上只是C++的一個子集。所以,人們也常常會選擇C語言作為第一教學(xué)語言,學(xué)會了C語言,基本上來說就打開了一扇窗,對學(xué)習(xí)其他語言就會有很好的基礎(chǔ)。
支持結(jié)構(gòu)化程序編寫模型
簡單地說,結(jié)構(gòu)化程序開發(fā)模型是源于一個科學(xué)家的發(fā)現(xiàn)。
他發(fā)現(xiàn),任何程序都可以分解成順序、選擇、循環(huán)三種結(jié)構(gòu)。
C語言在對這方面的支持,可以說非常好,甚至有支持過分的嫌疑,在我們學(xué)習(xí)C語言的語法的第一階段,基本上來說,你只要掌握了main函數(shù)的概念,然后會在main函數(shù)中定義數(shù)據(jù)變量,并且能在后面的過程中使用數(shù)據(jù)變量。能編寫順序、選擇、循環(huán)三種結(jié)構(gòu),你就相當(dāng)于掌握了最基本的C語言編程的技術(shù)了。
變量和語句是C語言的細(xì)胞
在C語言中,定義數(shù)據(jù),編寫操作數(shù)據(jù)的語句,得到我們想要的結(jié)果,是基本要求。
int、char和float是三種基本數(shù)據(jù)類型。
一個語句就是一個機(jī)器動作:這個機(jī)器是指計算機(jī)的CPU,電子設(shè)備也是人造的機(jī)器。
一個語句可以是定義數(shù)據(jù);(有些圖書說定義數(shù)據(jù)沒有產(chǎn)生機(jī)器操作,不算語句,我個人認(rèn)為大多數(shù)編譯器會產(chǎn)生內(nèi)存分配和賦予初值,也算語句。)
一個語句可以是給數(shù)據(jù)賦值;
一個語句可以是判斷然后運算;
一個語句可以是某個函數(shù)的調(diào)用;
最有意思的語句是浪費一下機(jī)器時間,稱為空語句,某些調(diào)試的時候常常要用到這種技巧。
數(shù)學(xué)運算和邏輯表達(dá)式是C語言的第一個難點
很多人說,有一定的數(shù)學(xué)基礎(chǔ)是學(xué)習(xí)開發(fā)語言的基本條件。
其實,這有些夸大了,只要你是一個邏輯基本正常的人,就有機(jī)會成為一個程序員。你只要非常細(xì)致的研究一下邏輯運算,并在寫代碼的時候,注意保持正常邏輯就可以。
計算機(jī)其實是很傻的,理解不了人類可以輕松理解的數(shù)據(jù)計算。不僅是C語言中,其實幾乎所有的程序設(shè)計語言中,只有相同數(shù)據(jù)類型的變量可以在一起做加減乘除運算。也就是說,int型數(shù)據(jù)和int型數(shù)據(jù)一起運算,float型數(shù)據(jù)和float型數(shù)據(jù)一起運算……強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換和做除法的時候,我們還要多加小心,應(yīng)考慮到分配內(nèi)存的接受情況,其實機(jī)器只是在我們的要求限制下幫助我們運算,機(jī)器終究還是機(jī)器,還是很笨、很死板的。
函數(shù)是C語言賜給我們最有力的武器
掌握了最基本的C語法,我們下一個必須要明白的特點是C語言對函數(shù)的支持。雖然,不用函數(shù)模式,我們也能編寫程序。但就像軍隊中分為各個等級一樣,函數(shù)的出現(xiàn),讓程序更符合人類的思維模式。
我們編寫了某個功能模塊,只記得這個功能模塊的功能即可。不用每次都重復(fù)編寫。而且,我們可以調(diào)用別人寫的函數(shù)模塊,這使得程序開發(fā)的分工成為可能。
還需要指出的一個常見的謬誤是,標(biāo)準(zhǔn)函數(shù)庫并不是C語言本身的一部分。雖然它給我們帶來了很多的方便,但精巧的C語言,自己是不會帶上包袱的。函數(shù)庫是各個開發(fā)工具自己實現(xiàn)的,編譯后成為程序的一部分。
函數(shù)的定義如此重要,你能區(qū)別參數(shù)的概念,明確函數(shù)中定義的變量的使用范圍了嗎?
數(shù)組是我們第一次學(xué)習(xí)組織數(shù)據(jù)
相同類型的數(shù)據(jù)可以整合在一起使用,這是我們第一次在C語言中嘗試學(xué)習(xí)組織數(shù)據(jù)。
第一次學(xué)習(xí)的時候,相對而言,二維數(shù)組有些復(fù)雜,你可以跳過。
數(shù)組中數(shù)據(jù)的引用有兩種方式,其中后面一種是指針的方式。指針方式有一個非常大的隱患就是可能會越界,然后程序跑飛。C語言就像一個手動車床,越界這種事情,必須要我們自己來避免,它的編譯器一般不會提醒我們。
指針是C語言的精華,但它是魔鬼發(fā)明的
C語言之所以能在底層開發(fā)中獲得如此多的應(yīng)用,和它能輕松操縱內(nèi)存中的數(shù)據(jù)有莫大的關(guān)系。而實現(xiàn)這個內(nèi)存處理的設(shè)計就是指針。
簡單來說,指針就是記錄所指數(shù)據(jù)在內(nèi)存中的位置。
所有的指針,記錄的都是一個地址。
指針如此的方便,我們可以從一個地址獲得一個變量數(shù)據(jù),也可以獲得這個地址前后偏移的數(shù)據(jù)(數(shù)組),還可以從這個地址調(diào)用一段程序代碼(函數(shù)指針)。
但又要求我們必須明確,這個指針指向的是代碼還是數(shù)據(jù),一切都讓程序員自己做主,仿佛整個機(jī)器都由我們自由掌控。
所以,在使用指針的時候,我們要尤其小心,要總結(jié)一些使用規(guī)范。
struct是我們臨摹世界的畫板
小紅的身高是1.63m,體重是56.3公斤,今年23歲。
在機(jī)器里面,一個float數(shù)據(jù)定義小紅的身高,另一個float數(shù)據(jù)定義她的體重,一個int數(shù)據(jù)定義她的年紀(jì)。不過,這種分別定義的方法,總感覺不是定義世界上任何對象的思維。C語言提供了struct,可以定義一個新的數(shù)據(jù)類型:people。
這種用已有的數(shù)據(jù)類型定義新的數(shù)據(jù)類型的方法,稱為構(gòu)造數(shù)據(jù)類型。
除了struct之外,還有unin等類型。C語言并不只是使用int,float,double,char,viod這幾種類型??梢詷?gòu)造新的數(shù)據(jù)類型。
更絕妙的是,當(dāng)定義了一個新的構(gòu)造類型之后,在定義其他構(gòu)造類型的時候,也可以大膽使用。
掌握基本概念的組合才是成為C語言高手的必經(jīng)之路
三種語句,函數(shù),數(shù)組,指針,結(jié)構(gòu)體……這些概念。單一來學(xué)習(xí)都比較容易掌握,但當(dāng)它們結(jié)合起來的時候,你還能掌握,你才是真正的C語言高手。
指針作為函數(shù)參數(shù)是函數(shù)的概念和指針概念的組合。
函數(shù)指針是函數(shù)概念和指針概念的交集。
數(shù)組作為函數(shù)的參數(shù)呢?
數(shù)組和指針的區(qū)別呢?
指向結(jié)構(gòu)體的指針呢?
結(jié)構(gòu)體中還定義了指向自己的指針了嗎?
……
一個知識好掌握,兩個知識好掌握,n個知識都好掌握,n個知識互相之間產(chǎn)生的關(guān)聯(lián),就需要掌握n2個知識,你掌握了嗎?
字符串是指針確認(rèn)的
在C語言中,字符串是一個很特殊的學(xué)習(xí)工具。
它可以由字符數(shù)組定義,也可以由字符指針來使用。
更絕妙的是,在使用字符串的時候,可以通過函數(shù)庫中幾個經(jīng)典函數(shù)來操作。
打開函數(shù)庫中這幾個函數(shù)的源代碼,是最好的學(xué)習(xí)C語言編程知識和技能的源代碼之一。還不好好利用一下。
“能否掌握struct和指針的結(jié)合決定你是否能夠得到高薪?!?/p>
當(dāng)然,這只是一個開玩笑的口號,但struct和指針兩個基本概念的組合的確是所有數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)。所以,掌握它們的應(yīng)用,能應(yīng)用基本的數(shù)據(jù)結(jié)構(gòu)和算法,就是高手的表現(xiàn)。這當(dāng)然是本書的一個重點了。
你要知道,你現(xiàn)在正在使用的電腦,不知道有多少鏈表數(shù)據(jù)正在其中運行。
位運算是C語言底層開發(fā)的特色
不但可以操作任何一個數(shù)據(jù),C語言還可以操作任意一個數(shù)據(jù)位。
這基本上也是C語言“可怕”的地方之一。
而這個特色,也確實在一些底層開發(fā)中給我們帶來了很多的方便和技巧。
本書中將會舉一個充分利用每一個位的數(shù)據(jù)來簡化程序開發(fā)的案例。
這個案例非常經(jīng)典,本人的一次職場面試中就實際碰到。也許下一次碰到的,就是你了。
預(yù)處理命令是程序開發(fā)的腳手架
表面上,所有的預(yù)處理命令都不產(chǎn)生機(jī)器代碼。
但卻幫了我們的大忙:
幫我們定義新的數(shù)據(jù)類型;
幫我們把代碼分割成幾個文件;
幫我們定義常量;
幫助我們編寫適應(yīng)力強(qiáng)的代碼;
幫我們調(diào)試……
你如果想成為一個專業(yè)的職業(yè)程序員,這是必須掌握的基本技能。
文件是一個序列
其實,文件是一種數(shù)據(jù)流思想,我們操作這個數(shù)據(jù)流,也是通過一些標(biāo)準(zhǔn)函數(shù)來實現(xiàn)的,小巧的嵌入式程序,并不需要這么大的文件操作,但這些應(yīng)用思想在實際開發(fā)中卻應(yīng)用良多。
- MATLAB圖像處理超級學(xué)習(xí)手冊
- JIRA 7 Administration Cookbook(Second Edition)
- Python程序設(shè)計(第3版)
- 技術(shù)領(lǐng)導(dǎo)力:程序員如何才能帶團(tuán)隊
- Mastering Kali Linux for Web Penetration Testing
- Java Web開發(fā)技術(shù)教程
- Android底層接口與驅(qū)動開發(fā)技術(shù)詳解
- 劍指Java:核心原理與應(yīng)用實踐
- RSpec Essentials
- ExtJS高級程序設(shè)計
- 軟件測試實用教程
- Java Fundamentals
- PHP+MySQL動態(tài)網(wǎng)站開發(fā)從入門到精通(視頻教學(xué)版)
- Java多線程并發(fā)體系實戰(zhàn)(微課視頻版)
- FusionCharts Beginner’s Guide:The Official Guide for FusionCharts Suite