freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

c語(yǔ)言編程要點(diǎn)(編輯修改稿)

2024-09-26 10:02 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 a= b+(((c/d)/function— call())* 5) 這樣,就能確保表達(dá)式被正確求值,而且編譯程序不會(huì)為了優(yōu)化代碼而重新安排運(yùn)算符的優(yōu)先級(jí)了。 1. 13 ++var 和 var++有什么區(qū)別 ? “++” 運(yùn)算符被稱為自增運(yùn)算符。如果 “++” 運(yùn)算符出現(xiàn)在變量的前面 (++var),那么在表達(dá)式使用變量之前,變量的值將增加 1。如果 “++” 運(yùn)算符出現(xiàn)在變量之后 (var++),那么先對(duì)表達(dá)式求值,然后變量的值才增加 1。對(duì)自減運(yùn)算符 ()來說,情況完全相同。如果運(yùn)算符出現(xiàn)在變量的前面,則相應(yīng)的運(yùn)算被稱為前綴運(yùn)算;反之,則稱為后綴運(yùn)算。 例如,請(qǐng)看一個(gè)使用后綴自增運(yùn)算符的例子: int x, y。 x=1。 y=(x++* 5); 上例使用了后綴自增運(yùn)算符,在求得表達(dá)式的值之后, x 的值才增加 1,因此, y 的值為 1乘以 5,等于 5。在求得表達(dá)式的值之后, x 自增為 2。 現(xiàn)在看一個(gè)使用前綴自增運(yùn)算符的例子: int x, y。 x=1。 y=(++x*5)。 這個(gè)例子和前一個(gè)相同,只不過使用了前綴自增運(yùn)算符,而不是后綴自增運(yùn)算符,因此,x 的值先增加 1,變?yōu)?2,然后才求得表達(dá)式的值。這樣, y 的值為 2 乘以 5,等于 10。 1. 14 取模運(yùn)算符 (modulus operator)“% ”的作用是什么 ? 取模運(yùn)算符 “ % ” 的作用是求兩個(gè)數(shù)相除的余數(shù)。例如,請(qǐng)看下面這段代碼: x=15/7。 如果 x 是一個(gè)整數(shù), x 的值將為 2。然而,如果用取模運(yùn)算符代替除法運(yùn)算符 /,得到的結(jié)果就不同了: X=15% 7。 這個(gè)表達(dá)式的結(jié)果為 15除以 7 的余數(shù),等于 1。這就是說, 15除以 7 得 2 余 1。 取模運(yùn)算符通常用來判斷一個(gè)數(shù)是否被另一個(gè)數(shù)整除。例如,如果你要打印字母表中序號(hào)為 3的倍數(shù)的字母,你可以使用下面這段代碼: int x。 for(x= 1。 x=26。 x++) if((x%3)== 0) 11 printf(%c。 x+64)。 上例將輸出字符串 cfilorux,即字母表中序號(hào)為 3的倍數(shù)的所有字母。 第 2章 變量和數(shù)據(jù)存儲(chǔ) C 語(yǔ)言的強(qiáng)大功能之 一是可以靈活地定義數(shù)據(jù)的存儲(chǔ)方式。 C 語(yǔ)言從兩個(gè)方面控制變量的性質(zhì):作用域 (scope)和生存期 (lifetime)。作用域是指可以存取變量的代碼范圍,生存期是指可以存取變量的時(shí)間范圍。 作用域有三種: 1. extern(外部的 ) 這是在函數(shù)外部定義的變量的缺省存儲(chǔ)方式。 extern 變量的作用域是整個(gè)程序。 2. static(靜態(tài)的 ) 在函數(shù)外部說明為 static 的變量的作用域?yàn)閺亩x點(diǎn)到該文件尾部;在函數(shù)內(nèi)部說明為 static 的變量的作用域?yàn)閺亩x點(diǎn)到該局部程序塊尾部。 3. auto(自動(dòng)的 ) 這是在函數(shù)內(nèi)部說明的變量的缺省存儲(chǔ)方式。 auto 變量的作用域?yàn)閺亩x點(diǎn)到該局部程序塊尾部。 變量的生存期也有三種,但它們不象作用域那樣有預(yù)定義的關(guān)鍵字名稱。第一種是 extern和 static 變量的生存期,它從 main()函數(shù)被調(diào)用之前開始,到程序退出時(shí)為止。第二種是函數(shù)參數(shù)和 auto 變量的生存期,它從函數(shù)調(diào)用時(shí)開始,到函數(shù)返回時(shí)為止。第三種是動(dòng)態(tài)分配的數(shù)據(jù)的生存期,它從程序調(diào)用 malloc()或 calloc()為數(shù)據(jù)分配存儲(chǔ)空間時(shí)開始,到程序調(diào)用 free()或程序退出時(shí)為 止。 . 變量存儲(chǔ)在內(nèi)存 (memory)中的什么地方 ? 變量可以存儲(chǔ)在內(nèi)存中的不同地方,這依賴于它們的生存期。在函數(shù)外部定義的變量 (全局變量或靜態(tài)外部變量 )和在函數(shù)內(nèi)部定義的 static 變量,其生存期就是程序運(yùn)行的全過程,這些變量被存儲(chǔ)在數(shù)據(jù)段 (datasegment)中。數(shù)據(jù)段是在內(nèi)存中為這些變量留出的一段大小固定的空間,它分為兩部分,一部分用來存放初始化變量,另一部分用來存放未初始化變量。 在函數(shù)內(nèi)部定義的 auto變量 (沒有用關(guān)鍵字 static定義的變量 )的生存期從程序開始執(zhí)行其所在的程序塊 代碼時(shí)開始,到程序離開該程序塊時(shí)為止。作為函數(shù)參數(shù)的變量只在調(diào)用該函數(shù)期間存在。這些變量被存儲(chǔ)在棧 (stack)中。棧是內(nèi)存中的一段空間,開始很小,以后逐漸自動(dòng)增大,直到達(dá)到某個(gè)預(yù)定義的界限。在象 DOS這樣的沒有虛擬內(nèi)存 (virtual memory)的系統(tǒng)中,這個(gè)界限由系統(tǒng)決定,并且通常非常大,因此程序員不必?fù)?dān)心用盡??臻g。關(guān)于虛擬內(nèi)存 的討論,請(qǐng)參見 2. 3。 第三種 (也是最后一種 )內(nèi)存空間實(shí)際上并不存儲(chǔ)變量,但是可以用來存儲(chǔ)變量所指向的數(shù)據(jù)。如果把調(diào)用 malloc()函數(shù)的結(jié)果賦給一個(gè)指 針變量,那么這個(gè)指針變量將包含一塊動(dòng)態(tài)分配的內(nèi)存的地址,這塊內(nèi)存位于一段名為 “ 堆 (heap)” 的內(nèi)存空間中。堆開始時(shí)也很小,但當(dāng)程序員調(diào)用 malloc()或 calloc()等內(nèi)存分配函數(shù)時(shí)它就會(huì)增大。堆可以和數(shù)據(jù)段或棧共用一個(gè)內(nèi)存段(memorysegment),也可以有它自己的內(nèi)存段,這完全取決于編譯選項(xiàng)和操作系統(tǒng)。 與棧相似,堆也有一個(gè)增長(zhǎng)界限,并且決定這個(gè)界限的規(guī)則與棧相同。 請(qǐng)參見: 1. 1 什么是局部程序塊 (10calblock)? 2. 2 變量必須初始化嗎 ? 12 2. 3 什么是頁(yè)抖動(dòng) (pagethrashing)? 7. 20 什么是棧 (stack)? 7. 21 什么是堆 (heap)7 . . 變量必須初始化嗎 ? 不。使用變量之前應(yīng)該給變量一個(gè)值,一個(gè)好的編譯程序?qū)椭惆l(fā)現(xiàn)那些還沒有被給定一個(gè)值就被使用的變量。不過,變量不一定需要初始化。在函數(shù)外部定義的變量或者在函數(shù)內(nèi)部用 static 關(guān)鍵字定義的變量 (被定義在數(shù)據(jù)段中的那些變量,見 2. 1)在沒有明確地被程序初始化之前都已被系統(tǒng)初始化為 0 了。在函數(shù)內(nèi)部或程序塊內(nèi)部定義的不帶 static 關(guān)鍵字的變量都是自動(dòng)變量,如果你沒有明確地初始化這些變量,它們就會(huì)具有未定義值。如果你沒有初始化一個(gè)自動(dòng)變量,在使用它之前你就必須保證先給它賦值。 調(diào)用 malloc()函數(shù)從堆中分配到的空間也包含未定義的數(shù)據(jù),因此在使用它之前必須先進(jìn)行初始化,但調(diào)用 calloc()函數(shù)分配到的空間在分配時(shí)就已經(jīng)被初始化為 0 了。 請(qǐng)參見: 1. 1 什么是局部程序塊 (10calblock)? 7. 20 什么是棧 (stack)? 7. 21 什么是堆 (heap)? . 什么是頁(yè)抖動(dòng) (pagethrashing)? 有些操作系統(tǒng) (如 UNIX 和增強(qiáng)模式下的 Windows)使用虛擬內(nèi)存,這是一種使機(jī)器的作業(yè)地址空間大于實(shí)際內(nèi)存的技術(shù),它是通過用磁盤空間模擬 RAM(random— access memory)來實(shí)現(xiàn)的。 在 80386 和更高級(jí)的 Intel CPU 芯片中,在現(xiàn)有的大多數(shù)其它微處理器 (如 Motorola 68030, sparc 和 Power PC)中,都有一個(gè)被稱為內(nèi)存管理單元 (Memory Management Unit,縮寫為MMU)的器件。 MMU 把內(nèi)存看作是由一系列 “ 頁(yè) (page)” 組成的來處理。一頁(yè)內(nèi)存是指一個(gè)具有一定大小的連續(xù)的內(nèi)存塊,通常為 4096 或 8192 字節(jié)。操作系統(tǒng)為每個(gè)正在運(yùn)行的程序建立并維護(hù)一張被稱為進(jìn)程內(nèi)存映射 (Process Memory Map,縮與為 PMM)的表,表中記錄了程序可以存取的所有內(nèi)存頁(yè)以及它們的實(shí)際位置。 每當(dāng)程序存取一塊內(nèi)存時(shí),它會(huì)把相應(yīng)的地址 (虛擬地址, virtualaddress)傳送給 MMU,MMU 會(huì)在 PMM 中查找這塊內(nèi)存的實(shí)際位置 (物理地址, physical address),物理地址可以是由操作系統(tǒng)指定的在內(nèi)存中或磁盤上的 任何位置。如果程序要存取的位置在磁盤上,就必須把包含該地址的頁(yè)從磁盤上讀到內(nèi)存中,并且必須更新 PMM以反映這個(gè)變化 (這被稱為 pagefault,即頁(yè)錯(cuò) )。 希望你繼續(xù)讀下去,因?yàn)橄旅婢鸵榻B其中的難點(diǎn)了。存取磁盤比存取 RAM 要慢得多,所以操作系統(tǒng)會(huì)試圖在 RAM 中保持盡量多的虛擬內(nèi)存。如果你在運(yùn)行一個(gè)非常大的程序 (或者同時(shí)運(yùn)行幾個(gè)小程序 ),那么可能沒有足夠的 RAM 來承擔(dān)程序要使用的全部?jī)?nèi)存,因此必須把一些頁(yè)從RAM 中移到磁盤上 (這被為 pagingout,即頁(yè)出 )。 操作系統(tǒng)會(huì)試圖去判斷 哪些頁(yè)可能暫時(shí)不會(huì)被使用 (通?;谶^去使用內(nèi)存的情況 ),如果它判斷錯(cuò)了,或者程序正在很多地方存取很多內(nèi)存,那么為了讀入已調(diào)出的頁(yè),就會(huì)產(chǎn)生大量頁(yè)錯(cuò)動(dòng)作。因?yàn)?RAM 已被全部使用,所以為了調(diào)入要存取的一頁(yè),必須調(diào)出另一頁(yè),而這將導(dǎo)致更多的頁(yè)錯(cuò)動(dòng)作,因?yàn)榇藭r(shí)不同的一頁(yè)已被移到磁盤上。在短時(shí)間內(nèi)出現(xiàn)大量頁(yè)錯(cuò)動(dòng)作的情形被稱為頁(yè)抖動(dòng),它將大大降低系統(tǒng)的執(zhí)行效率。 頻繁存取內(nèi)存中大量散布的位置的程序更容易在系統(tǒng)中造成頁(yè)抖動(dòng)。如果同時(shí)運(yùn)行許多小程序,而實(shí)際上已經(jīng)不再使用這些程序,也很容易造成頁(yè)抖動(dòng)。為了減少頁(yè)抖動(dòng), 你應(yīng)該減少同時(shí)運(yùn)行的程序的數(shù)目。對(duì)于大的程序,你應(yīng)該改變它的工作方式,以盡量使操作系統(tǒng)能準(zhǔn)確地判 13 斷出哪些頁(yè)不再需要。為此,你可以使用高速緩沖存儲(chǔ)技術(shù),或者改變用于大型數(shù)據(jù)結(jié)構(gòu)的查找算法,或者使用效率更高的 malloc()函數(shù)。當(dāng)然,你也可以考慮增加系統(tǒng)的 RAM,以減少頁(yè)出動(dòng)作。 請(qǐng)參見: 7. 17 怎樣說明一個(gè)大于 640KB 的數(shù)組 ? 7. 21 什么是堆 (heap)? 18. 14 怎樣才能使 DOS 程序獲得超過 64KB 的可用內(nèi)存 ? 21. 31 Windows 是怎樣組織 內(nèi)存的 ? . 什么是 const 指針 ? 如果希望一個(gè)變量在被初始化后其值不會(huì)被修改,程序員就會(huì)通過 const,修飾符和編譯程序達(dá)成默契。編譯程序會(huì)努力去保證這種默契 —— 它將禁止程序中出現(xiàn)對(duì)說明為 const 的變量進(jìn)行修改的代碼。 const 指針的準(zhǔn)確提法應(yīng)該是指向 const 數(shù)據(jù)的指針,即它所指向的數(shù)據(jù)不能被修改。只要在指針說明的開頭加入 const 修飾符,就可說明一個(gè) cosnt 指針。盡管 const 指針?biāo)赶虻臄?shù)據(jù)不能被修改,但 cosnt 指針本身是可以修改的。下面給出了 const 指針的一些合法和非法的 用法例子: const char *str=hello。 char c=*str。 /*legal*/ str++。 /*legal*/ *str=39。a39。 /* illegal */ str[1]= 39。b39。 /*illegal*/ 前兩條語(yǔ)句是合法的,因?yàn)樗鼈儧]有修改 str 所指向的數(shù)據(jù);后兩條語(yǔ)句是非法的,因?yàn)樗鼈円薷?str 所指向的數(shù)據(jù)。 在說明函數(shù)參數(shù)時(shí),常常要使用 const 指針。例如,一個(gè)計(jì)算字符串長(zhǎng)度的函數(shù)不必改變字符串內(nèi)容,它可以寫成這樣: my_strlen(const char *str) { int count=0。 while ( * str++) { count ++。 } return count。 } 注意,如果有必要,一個(gè)非 const 指針可以被隱式地轉(zhuǎn)換為 const 指針,但一個(gè) const 指針不能被轉(zhuǎn)換成非 const 指針。這就是說,在調(diào)用 my_strlen()時(shí), 它的參數(shù)既可以是一個(gè) const指針,也可以是一個(gè)非 const 指針。 請(qǐng)參見: 2. 7 一個(gè)變量可以同時(shí)被說明為 const 和 volatile 嗎 ? 14 2. 8 什么時(shí)候應(yīng)該使用 const 修飾符 ? 2. 14 什么時(shí)候不應(yīng)該使用類型強(qiáng)制轉(zhuǎn)換 (type cast)? 2. 18 用 const 說明常量有什么好處 ? . 什么時(shí)候應(yīng)該使用 register 修飾符 ?它真的有用嗎 ? register 修飾符暗示編譯程序相應(yīng)的變量將被頻繁使用,如果可能的話,應(yīng)將其保存在CPU 的寄存 器中,以加快其存取速度。但是,使用 register 修飾符有幾點(diǎn)限制。 首先, register 變量必須是能被 CPU 寄存器所接受的類型。這通常意味著 register 變量必須是一個(gè)單個(gè)的值,并且其長(zhǎng)度應(yīng)小于或等于整型的長(zhǎng)度。但是,有些機(jī)器的寄存器也能存放浮點(diǎn)數(shù)。 其次,因?yàn)?register 變量可能不存放在內(nèi)存中,所以不能用取址運(yùn)算符 “amp?!?來獲取register 變量的地址。如果你試圖這樣做,
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1