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

下載本文檔

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

文檔簡介

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

2、是一門兼具高級語言功能和低級語言大部分功能的程序開發(fā)語言, 所 以既能開發(fā)應(yīng)用軟件也能開發(fā)系統(tǒng)軟件。 2、 C 程序是由函數(shù)構(gòu)成的,一個(gè) C 源程序至少且僅包含一個(gè) main 函數(shù)。一個(gè) C 程序總是從 main 函數(shù)開始執(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án)格區(qū)分大、小寫的,比如定義變量時(shí):int a

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

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

5、7 之間了,但有些編譯器默認(rèn)字符是無符號 (unsigned char) 的,范圍在 0 到 255 之間。 7、 %模運(yùn)算符 (求余數(shù))兩側(cè)均應(yīng)為整型數(shù)據(jù)。 8、 變量使用前必須先聲明,而且聲明要在代碼之前 ( 即變量聲明緊隨代碼塊左 大括號)。 9、 關(guān)系運(yùn)算符 (,=,=,!=) 的判斷結(jié)果有真 , 假兩個(gè)值 , 真值用非 0 表示 , 假用 0 表示,沒有 true 和 false 等關(guān)鍵字。 C 語言的邏輯運(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 都不會去執(zhí)行,最終結(jié)果就是 假。 11、 if 語言的判斷條件是一個(gè)關(guān)系表達(dá)式或邏輯表達(dá)式, 由于邏輯表達(dá)式的真 用非 0 代表,所以 if 語句的判斷條件可以是 0 和任意非 0 數(shù)值,包括(整數(shù)、實(shí)型、 字符3 型、指針型),如:if(3) printf(0k); 或者 if(a)printf(no); 都是 合法的。切記即使在條件判斷和循環(huán)判斷中傳的是負(fù)數(shù)也會為真,即 if(-2).while(-1) 等等這樣的表達(dá)式都

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

8、用邏輯右移則永遠(yuǎn)在高位補(bǔ) 0,所以右移負(fù)數(shù)時(shí)存在不可移植性問題。 23、 位段: C 語言中允許在一個(gè)結(jié)構(gòu)體中以位為單位制定其成員所占內(nèi)存長度, 這種以位為單位的成員稱為“位段”或稱“位域” 利用位段能夠用較少的位數(shù)存儲數(shù)據(jù)。 (前提也是在結(jié)構(gòu)體內(nè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)用之前聲明。 ( 沒有被聲明就調(diào)用的函數(shù)被

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

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

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

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

13、內(nèi)部就是函數(shù)的實(shí)現(xiàn), lib 庫中有那些函數(shù)名的聲明引用, 當(dāng)系統(tǒng)發(fā)現(xiàn)你調(diào)用 pow() 函數(shù)時(shí),就會去相應(yīng)文件夾下 lib 文件中找到 pow在哪個(gè)動態(tài)庫中調(diào)用了,然后把 動態(tài)庫中的此函數(shù)體自動加載到內(nèi)存執(zhí)行,大概過程就是這樣。 33、 C 語言把文件看做一個(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)存中的存儲形式原樣輸出到文件磁盤上存放。 注意文本 /二 進(jìn)制文件區(qū)別只是發(fā)生在文件打開

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

15、, 因此我們在寫代碼時(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、 聲明只確定了變量的基本類型以及初始值 (如果有的話 ). 39、 如何解析 C 語言聲明? 1 、取最左邊的標(biāo)示符 ( 變量名 ) 2 、查看標(biāo)示符右邊的下一個(gè)符號, 如果是方括號對于每一對方括號表示“ . 的數(shù)組”;如果是一個(gè)左括號,到右括號為止的內(nèi)容表示“返回 . 的函數(shù)”;

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

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

18、步: 不匹 配,再去第四步:左邊遇到一個(gè)*即(*next)外面緊跟 const 的那個(gè)*,表示“指向 的指針”,因?yàn)橛疫呂覀円呀?jīng)分析完了就不再看前三步了,繼續(xù)第四步遇到了 const ,“表示只讀”;再又是一個(gè)“指向 . 的指針”,最后就是 char 類型定義了。 上面所有合起來就是 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ǔ)碼請記?。簩τ谟蟹枖?shù), 正數(shù)和負(fù)數(shù)都是由補(bǔ)碼構(gòu)成的。 (匯編語 言) 一個(gè)正數(shù)的補(bǔ)碼取反加 1 后,為其負(fù)數(shù)

溫馨提示

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

評論

0/150

提交評論