最新C語(yǔ)言計(jì)算機(jī)_第1頁(yè)
最新C語(yǔ)言計(jì)算機(jī)_第2頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余8頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1 在 1973 年,美國(guó)貝爾實(shí)驗(yàn)室的 D.M.Ritchie(丹尼斯里奇)在 B 語(yǔ)言的基礎(chǔ) 上最終設(shè)計(jì)出了一種新的語(yǔ)言,他取了 BCPL 的第二個(gè)字母作為這種語(yǔ)言的名字,這 就是 C 語(yǔ)言,并首次用 C 重新實(shí)現(xiàn)了 UNIX 操作系統(tǒng)。 1978 年 Brian W. Kernighan 和 Dennis M. Ritchie 出版的名著C 程序設(shè)計(jì) 語(yǔ)言(The C ProgrammingLanguage,常被人們稱(chēng)為 K&R 版 C 教材或“白皮書(shū)”, 為 C語(yǔ)言的推廣普及立下汗馬功勞。在書(shū)籍方面我還要極力推薦的一本精典著作就 是C 和指針,寫(xiě)的特別深入、詳細(xì)。 1、 C 語(yǔ)言

2、是一門(mén)兼具高級(jí)語(yǔ)言功能和低級(jí)語(yǔ)言大部分功能的程序開(kāi)發(fā)語(yǔ)言, 所 以既能開(kāi)發(fā)應(yīng)用軟件也能開(kāi)發(fā)系統(tǒng)軟件。 2、 C 程序是由函數(shù)構(gòu)成的,一個(gè) C 源程序至少且僅包含一個(gè) main 函數(shù)。一個(gè) C 程序總是從 main 函數(shù)開(kāi)始執(zhí)行的,而不論 main 函數(shù)在整個(gè)程序的位置如何。 main(int argc,char *c) 主函數(shù)也可以帶參數(shù),此時(shí)在命令行執(zhí)行 test.exe ma wentao,那么總共有三個(gè)參數(shù), argc 就等于 3, c0是源程序名test.exe , c1 是 ma,c2 是 wen, c3 是 tao。 3、 C 語(yǔ)言是嚴(yán)格區(qū)分大、小寫(xiě)的,比如定義變量時(shí):int a

3、和 int A 是兩個(gè)完 全不同的變量。 4、 C 語(yǔ)言中整常數(shù)可以有 3 種表示形式: (1) 默認(rèn)為十進(jìn)制。 (2) 以 0 開(kāi)頭為八進(jìn)制,如: 0123 表示八進(jìn)制 123,十進(jìn)制為 83。 (3) 以 0 x 開(kāi)頭為十六進(jìn)制 ( 沒(méi)有直接表示二進(jìn)制格式, 所以可以用十六進(jìn)制表示 ), 如: 0 x123。 2 5、 數(shù)據(jù)類(lèi)型的長(zhǎng)度由編譯器決定, 比如 Turbo C 給 int 型變量分配 2 個(gè)字節(jié)的 存儲(chǔ)單元,而 Visual C+6.0 則分配 4 字節(jié)。 這里簡(jiǎn)單說(shuō)下 C 語(yǔ)言變量在內(nèi)存中的存儲(chǔ)位置: (1) 全局變量和靜態(tài)變量都在靜態(tài)內(nèi)存區(qū), 說(shuō)白了也就是普通內(nèi)存區(qū)即進(jìn)程所分

4、 配的地址空間,當(dāng)程序退出自動(dòng)釋放。 (2) 函數(shù)的參數(shù)和局部變量都在堆棧中, 函數(shù)退出后這些變量都會(huì)自動(dòng)出棧, 即 釋放內(nèi)存。 (3) 用 malloc 、 calloc 、 realloc 分配的內(nèi)存屬于堆區(qū),必須手動(dòng)調(diào)用 free 函 數(shù)釋放,否則會(huì)造成內(nèi)存泄露。 (4) 寄存器變量 , 直接存儲(chǔ)在寄存器中,存取值速度快,只有局部自動(dòng) ( 非靜態(tài) ) 變量和形式參數(shù)可以這樣定義。如: register . 6、 整數(shù)默認(rèn)就是有符號(hào)數(shù),浮點(diǎn)型常量默認(rèn)為雙精度,有些編譯器比如 Turbo C 把字符型變量默認(rèn)定義為 signed char 型,即有符號(hào)字符,這樣它的范圍就是-128 到 12

5、7 之間了,但有些編譯器默認(rèn)字符是無(wú)符號(hào) (unsigned char) 的,范圍在 0 到 255 之間。 7、 %模運(yùn)算符 (求余數(shù))兩側(cè)均應(yīng)為整型數(shù)據(jù)。 8、 變量使用前必須先聲明,而且聲明要在代碼之前 ( 即變量聲明緊隨代碼塊左 大括號(hào))。 9、 關(guān)系運(yùn)算符 (,=,=,!=) 的判斷結(jié)果有真 , 假兩個(gè)值 , 真值用非 0 表示 , 假用 0 表示,沒(méi)有 true 和 false 等關(guān)鍵字。 C 語(yǔ)言的邏輯運(yùn)算符(&,|,!)與、或、非的判斷結(jié)果是假則值為 0,結(jié)果為 真則值為非 0(包括任何非 0 數(shù))。 10、 邏輯表達(dá)式在求解中,并不是所有的邏輯運(yùn)算符都被執(zhí)行,只是在必

6、須執(zhí) 行下一個(gè)邏輯運(yùn)算符后才能確定表達(dá)式結(jié)果時(shí)才執(zhí)行后面運(yùn)算,比如: a&b&(如 果a 為真(非 0)才去計(jì)算 b,如果 a 為假(0)則 b 和 c 都不會(huì)去執(zhí)行,最終結(jié)果就是 假。 11、 if 語(yǔ)言的判斷條件是一個(gè)關(guān)系表達(dá)式或邏輯表達(dá)式, 由于邏輯表達(dá)式的真 用非 0 代表,所以 if 語(yǔ)句的判斷條件可以是 0 和任意非 0 數(shù)值,包括(整數(shù)、實(shí)型、 字符3 型、指針型),如:if(3) printf(0k); 或者 if(a)printf(no); 都是 合法的。切記即使在條件判斷和循環(huán)判斷中傳的是負(fù)數(shù)也會(huì)為真,即 if(-2).while(-1) 等等這樣的表達(dá)式都

7、會(huì)為真,只要不是 0 就為真。 12、 條件表達(dá)式即三目運(yùn)算符 x?a:b 中 a 和 b 的結(jié)果類(lèi)型不同,則三目運(yùn)算符 的最終結(jié)果會(huì)取類(lèi)型較高的,比如 xy?1:1.5 ,如果 xy 為真則最終結(jié)果為 1.0。 13、 for 循環(huán)中 for( 表達(dá)式 1;表達(dá)式 2;表達(dá)式 3) ,都可以省略這樣就成了 死循環(huán),但分號(hào)不能去掉。而且表達(dá)式 1 和表達(dá)式 3 中都可以包括多個(gè)表達(dá)式用逗 號(hào)分隔如,比如: for(i=1,j=2; i右移操作符: Turbo C 和其他一些編譯器采用的是算數(shù)右移,即對(duì)有符 號(hào)數(shù)右移時(shí), 如果原來(lái)符號(hào)位原來(lái)為 1,左面移入高位的是 1。如果某個(gè)編譯器對(duì)于 右移采

8、用邏輯右移則永遠(yuǎn)在高位補(bǔ) 0,所以右移負(fù)數(shù)時(shí)存在不可移植性問(wèn)題。 23、 位段: C 語(yǔ)言中允許在一個(gè)結(jié)構(gòu)體中以位為單位制定其成員所占內(nèi)存長(zhǎng)度, 這種以位為單位的成員稱(chēng)為“位段”或稱(chēng)“位域” 利用位段能夠用較少的位數(shù)存儲(chǔ)數(shù)據(jù)。 (前提也是在結(jié)構(gòu)體內(nèi), 并且類(lèi)型只能 是 int 、 unsigned int 、 singned int ) 例如: struct data unsigned a:8; unsigned b:2; unsigned c:6; da; 這樣定義的結(jié)構(gòu)體 a、b、c 分別占 8 位、2 位、6 位。 24、所有非整形函數(shù)一定要在調(diào)用之前聲明。 ( 沒(méi)有被聲明就調(diào)用的函數(shù)被

9、默認(rèn) 為返回整型) 6 (1) 函數(shù)前面不寫(xiě)返回值默認(rèn)就返回整型,但函數(shù)體此時(shí)可以不返回任何東西, 也可以返回整數(shù)。 (2) 函數(shù)不返回任何東西, 可以顯示的用 void 聲明, 比如這樣定義主函數(shù) void main() 。 (3) 函數(shù)如果沒(méi)有參數(shù),可以用 void 顯示說(shuō)明,即 void remove(void) 25、字符常數(shù)是 int 型,因此 sizeof(a) 是 sizeof(int) 即值為 4,而不是 1。 26、關(guān)鍵字 const 并不能把變量變成常量,在一個(gè)符號(hào)前加上 const 限定符只 是表示這個(gè)符號(hào)不能被賦值,可以初始化一次。 注意: const int * p;

10、 和 int const * p; 都叫常量指針 ( 這種讀法很簡(jiǎn)單,因 為先是 const 再是*) ,都是指針?biāo)傅膶?duì)象不能修改。 int * const p; 這和字符串常量、數(shù)組名 ( 當(dāng)做指針時(shí) ) 一樣都叫指針常量 , 表示 指針本身是不可變的。 const int * const p; 和 int const * const p; 表示指針和所指對(duì)象都是只 讀的。 27、void *v 類(lèi)型參數(shù)是一個(gè)通用的指針類(lèi)型,即這種類(lèi)型的指針可以轉(zhuǎn)換成 任意具體類(lèi)型的指針,但它不可以移動(dòng),比如: v+,v-1 等等,這是因?yàn)榇酥羔標(biāo)?指向的對(duì)象大小無(wú)法確定,那么它自然就不知道 +1 是移動(dòng)

11、多少了。 ( 這個(gè)解釋實(shí)在 太經(jīng)典了,嘿嘿 ) 、J 5 八、八、 ) 28、C 語(yǔ)言在定義數(shù)組時(shí),需要指定數(shù)組中元素的個(gè)數(shù),方括號(hào)中的表達(dá)式用 來(lái)表示元素的個(gè)數(shù),即數(shù)組長(zhǎng)度。下標(biāo)只能是表達(dá)式常量和符號(hào)常量,不能包含變 量,也就是說(shuō)C 語(yǔ)言不允許對(duì)數(shù)組大小作動(dòng)態(tài)定義,即數(shù)組的大小不依賴于程序運(yùn) 行過(guò)程中的變量值 例如: int a=10; int sa; 這樣是錯(cuò)誤的。 C語(yǔ)言在編譯時(shí)就要確定任何變量的存儲(chǔ)空間大小, 包括數(shù)組。(可以想想?yún)R 編數(shù)據(jù)段中的內(nèi)存分配 ) 7 29、 0123456789n%10這個(gè)表達(dá)式將返回 n(整數(shù))的最后一位數(shù)值,別忘了字 符串常量就是一個(gè)指針常量。 (為了

12、防止字符表中的數(shù)字沒(méi)有順序排列 ) 30、 對(duì)于參數(shù)的計(jì)算順序和整形數(shù)右移是否擴(kuò)展符號(hào)位,標(biāo)準(zhǔn)都沒(méi)有規(guī)定,只 能依賴編譯器了。 31、 C 語(yǔ)言中兩個(gè)字符串常量會(huì)自動(dòng)合并。 比如 char a=mawentao; 等價(jià) 于 char a=mawentao; 32、 有好多人經(jīng)常問(wèn)標(biāo)準(zhǔn)庫(kù)函數(shù)到底是在哪里實(shí)現(xiàn)的?為什么我們很簡(jiǎn)單的用 include 包含后,可就是找不到 math 的實(shí)現(xiàn),感覺(jué)很奇怪,之前我也覺(jué)得 很好奇,其實(shí)等你了解了動(dòng)態(tài)鏈接 (.dll) 、引用鏈接庫(kù) (.lib) 一切都會(huì)明白了,在 編譯器的某個(gè)文件夾下存在好多.dll 和.lib 文件,其中 dll 文件就是動(dòng)態(tài)鏈接庫(kù),

13、內(nèi)部就是函數(shù)的實(shí)現(xiàn), lib 庫(kù)中有那些函數(shù)名的聲明引用, 當(dāng)系統(tǒng)發(fā)現(xiàn)你調(diào)用 pow() 函數(shù)時(shí),就會(huì)去相應(yīng)文件夾下 lib 文件中找到 pow在哪個(gè)動(dòng)態(tài)庫(kù)中調(diào)用了,然后把 動(dòng)態(tài)庫(kù)中的此函數(shù)體自動(dòng)加載到內(nèi)存執(zhí)行,大概過(guò)程就是這樣。 33、 C 語(yǔ)言把文件看做一個(gè)字符(字節(jié)) 序列, 即 C 文件是一個(gè)字節(jié)流或二進(jìn)制 流,根據(jù)數(shù)據(jù)的組織形式不同, 可以分為 ascii 文件和二進(jìn)制文件 ascii 文件也叫 文本文件,它的每一個(gè)字節(jié)存放一個(gè) ascii 代碼,代表一個(gè)字符。二進(jìn)制文件是把 內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣輸出到文件磁盤(pán)上存放。 注意文本 /二 進(jìn)制文件區(qū)別只是發(fā)生在文件打開(kāi)

14、時(shí),一旦文件打開(kāi)之后,在其上調(diào)用什么 I/O 函 數(shù)無(wú)關(guān)緊要。 用 fopen 打開(kāi)文件時(shí),路徑有兩種寫(xiě)法:雙反斜杠 / 、單正斜杠 / 。 34、有些專(zhuān)家建議在 C 語(yǔ)言的操作符中牢記兩個(gè)優(yōu)先級(jí)就夠了:乘法和除法優(yōu) 先于加法和減法,在涉及到其他操作符時(shí),一律加上括號(hào)。雖然有點(diǎn)夸張了,但我 覺(jué)得我們真不應(yīng)該把時(shí)間浪費(fèi)在死記操作符的優(yōu)先級(jí)上,而且為了代碼的可讀性和 維護(hù)性就應(yīng)該多加括號(hào)。 35、 i=*x/*y; 這里本意是指針 x 所指向的內(nèi)容除以指針 y 所指向的內(nèi)容然后賦 給 i ,但/* 被理解為注釋開(kāi)始了,編譯器會(huì)報(bào)錯(cuò),所以 / 和*之間必須加上空格。這 也是空格作用體現(xiàn)的一個(gè)很好例子

15、, 因此我們?cè)趯?xiě)代碼時(shí)一定要養(yǎng)成一個(gè)好的習(xí)慣, 操作符兩邊都以空8 格分隔。 37、函數(shù)內(nèi)部不能返回一個(gè)局部數(shù)組指針,如 int* f()int a3=1,2,4; return a;,這樣返回了一個(gè)指針 a,但函數(shù)結(jié)束后整個(gè)數(shù)組都被釋放,a 指向的內(nèi) 存內(nèi)容是個(gè)未知的,或許已經(jīng)被別的內(nèi)容覆蓋,這是很危險(xiǎn)的。 38、 聲明只確定了變量的基本類(lèi)型以及初始值 (如果有的話 ). 39、 如何解析 C 語(yǔ)言聲明? 1 、取最左邊的標(biāo)示符 ( 變量名 ) 2 、查看標(biāo)示符右邊的下一個(gè)符號(hào), 如果是方括號(hào)對(duì)于每一對(duì)方括號(hào)表示“ . 的數(shù)組”;如果是一個(gè)左括號(hào),到右括號(hào)為止的內(nèi)容表示“返回 . 的函數(shù)”;

16、 (如 果變量名臨近右邊無(wú)任 何有價(jià)值的符號(hào)就直接走第 3 步,比如 int (*p)2) 3 、接著查看的左邊符號(hào),如果是一個(gè)左括號(hào),這個(gè)左括號(hào)把已經(jīng)處理的部 分聲明組合在一起,直到遇見(jiàn)對(duì)應(yīng)的右括號(hào),然后從第 2 步從新開(kāi)始; 4 、 上面三部分析完后, 在看已經(jīng)處理的部分左邊的符號(hào)如果是下述之一: const 、volatile 、 *, 則繼續(xù)向左邊讀符號(hào) ,直到所讀符號(hào)不再是上面那三個(gè)之一。 如果符號(hào)是 const,表示“只讀”;如果是 volatile 表示volatile;如果是*,表 示“指向 . 的指針”然后重復(fù)第三步; 5 、剩下的符號(hào)形成聲明的基本類(lèi)型,剩下的所有符號(hào)可以一

17、并閱讀,如: static unsigned int 。 切記: const 或 volatile 關(guān)鍵字后面如果緊跟類(lèi)型說(shuō)明符如 (int 、long), 則它作用于類(lèi)型說(shuō)明符,其他情況下都作用于左邊的臨近指針星號(hào)。 舉例比如: char * const *(*next)(); 我們來(lái)簡(jiǎn)單分析下這個(gè)聲明,就按照上面的 5 個(gè)步驟進(jìn)行: 1 、取最左邊的標(biāo)示符: next ,表示變量 next 是個(gè) . ; 2 和 3 都不匹配; 4 、next 左邊是*,表示“ next 是指向. 的指針”;再重復(fù)第三步, 匹配到 了一9 對(duì)小括號(hào)后再?gòu)牡诙介_(kāi)始, 表示“返回 . 的函數(shù)”; 接著又到第三

18、步: 不匹 配,再去第四步:左邊遇到一個(gè)*即(*next)外面緊跟 const 的那個(gè)*,表示“指向 的指針”,因?yàn)橛疫呂覀円呀?jīng)分析完了就不再看前三步了,繼續(xù)第四步遇到了 const ,“表示只讀”;再又是一個(gè)“指向 . 的指針”,最后就是 char 類(lèi)型定義了。 上面所有合起來(lái)就是 next 是一個(gè)指向函數(shù)的指針,該函數(shù)返回另一個(gè)指 針,該指針指向一個(gè)只讀的指向 char 的指針。 再舉例: char *(* c10)(int *p) 就表示: c 是一個(gè)指針數(shù)組,即里面的元素全是 指針,每個(gè)指針都指向一個(gè)函數(shù),即函數(shù)指針,該函數(shù)有個(gè)指向 int 型指針的指針 的參數(shù),返回值是個(gè) char 型指針。 注意: 在數(shù)組中被函數(shù)指針指向的所有函數(shù)都把一個(gè)指向指針的指針作為 它們的唯一參數(shù)。 (上面就是一個(gè)例子 ) 40、關(guān)于補(bǔ)碼請(qǐng)記住:對(duì)于有符號(hào)數(shù), 正數(shù)和負(fù)數(shù)都是由補(bǔ)碼構(gòu)成的。 (匯編語(yǔ) 言) 一個(gè)正數(shù)的補(bǔ)碼取反加 1 后,為其負(fù)數(shù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論