標識符的含義_第1頁
標識符的含義_第2頁
標識符的含義_第3頁
標識符的含義_第4頁
標識符的含義_第5頁
全文預覽已結(jié)束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、標識符的含義標識符也稱為名字,可以指代多種實體:函數(shù)、結(jié)構(gòu)標記、聯(lián)合標記和枚舉標記;結(jié)構(gòu)成員或聯(lián)合成員;枚舉常量;類型定義名;標號以及對象等。對象有時也稱為變量,它是一個存儲位置。對它的解釋依賴于兩個主要屬性:存儲類和類型。存儲類決定了與該標識對象相關聯(lián)的存儲區(qū)域的生存期,類型決定了標識對象中值的含義。名字還具有一個作用域和一個連接。作用域即程序中可以訪問此名字的區(qū)域,連接決定另一作用域中的同一個名字是否指向同一個對象或函數(shù)。作用域和連接將在A.11節(jié)中討論。A.4.1存儲類存儲類分為兩類:自動存儲類(automatic)和靜態(tài)存儲類(static)。聲明對象時使用的一些關鍵字和聲明的上下文共

2、同決定了對象的存儲類。自動存儲類對象對于一個程序塊(參見A93節(jié))來說是局部的,在退出程序塊時該對象將消失。如果沒有使用存儲類說明符,或者如果使用了auto限定符,則程序塊中的聲明生成的都是自動存儲類對象。聲明為register的對象也是自動存儲類對象,并且將被存儲在機器的快速寄存器中(如果可能的話)。靜態(tài)對象可以是某個程序塊的局部對象,也可以是所有程序塊的外部對象。無論是哪一種情況,在退出和再進入函數(shù)或程序塊時其值將保持不變。在一個程序塊(包括提供函數(shù)代碼的程序塊)內(nèi),靜態(tài)對象用關鍵字static聲明。在所有程序塊外部聲明且與函數(shù)定義在同一級的對象總是靜態(tài)的??梢酝ㄟ^static關鍵字將對象

3、聲明為某個特定翻譯單元的局部對象,這種類型的對象將具有內(nèi)部連接。當省略顯式的存儲類或通過關鍵字extern進行聲明時,對象對整個程序來說是全局可訪問的,并且具有外部連接。A.4.2基本類型基本類型包括多種。附錄B中描述的標準頭文件中定義了本地實現(xiàn)中每種類型的最大值和最小值。附錄B給出的數(shù)值表示最小的可接受限度。聲明為字符(char)的對象要大到足以存儲執(zhí)行字符集中的任何字符。如果字符集中的某個字符存儲在一個char類型的對象中,則該對象的值等于字符的整型編碼值,并且是非負值。其它類型的對象也可以存儲在char類型的變量中,但其取值范圍,特別是其值是否帶符號,同具體的實現(xiàn)有關。以unsigned

4、char聲明的無符號字符與普通字符占用同樣大小的空間,但其值總是非負的。以signedchar顯式聲明的帶符號字符與普通字符也占用同樣大小的空間。說明:本書的第1版中沒有unsignedchar類型,但這種用法很常見。signedchar是新增加的。除char類型外,還有3種不同大小的整型類型:shortint、int和Iongint。普通int對象的長度與由宿主機器的體系結(jié)構(gòu)決定的自然長度相同。其它類型的整型可以滿足各種特殊的用途。較長的整數(shù)至少要占有與較短整數(shù)一樣的存儲空間;但是具體的實現(xiàn)可以使得一般整型(int)與短整型(shortint)或長整型(longint)具有同樣的大小。除非特

5、別說明,int類型都表示帶符號數(shù)。以關鍵字unsigned聲明的無符號整數(shù)遵守算術模2n的規(guī)則,其中,n是表示相應整數(shù)的二進制位數(shù),這樣,對無符號數(shù)的算術運算永遠不會溢出??梢源鎯υ趲Х枌ο笾械姆秦撝档募鲜强梢源鎯υ谙鄳臒o符號對象中的值的子集,并且,這兩個集合的重疊部分的表示是相同的。單精度浮點數(shù)(float)、雙精度浮點數(shù)(double)和多精度浮點數(shù)(longdouble)中的任何類型都可能是同義的,但精度從前到后是遞增的。說明:longdouble是新增加的類型。在第1版中,longfloat與double類型等價,但現(xiàn)在是不相同的。枚舉是一個具有整型值的特殊的類型。與每個枚舉相關

6、聯(lián)的是一個命名常量的集合(參見A.8.4節(jié))。枚舉類型類似于整型。但是,如果某個特定枚舉類型的對象的賦值不是其常量中的一個,或者賦值不是一個同類型的表達式,則編譯器通常會產(chǎn)生警告信息。因為以上這些類型的對象都可以被解釋為數(shù)字,所以,可以將它們統(tǒng)稱為算術類型。char類型、各種大小的int類型(無論是否帶符號)以及枚舉類型都統(tǒng)稱為整型類型(integraltype)。類型float、double和longdouble統(tǒng)稱為浮點類型(floatingtype)。void類型說明一個值的空集合,它常被用來說明不返回任何值的函數(shù)的類型。A.4.3派生類型除基本類型外,我們還可以通過以下幾種方法構(gòu)造派生

7、類型,從概念來講,這些派生類型可以有無限多個:*給定類型對象的數(shù)組返回給定類型對象的函數(shù)指向給定類型對象的指針*包含一系列不同類型對象的結(jié)構(gòu)*可以包含多個不同類型對象中任意一個對象的聯(lián)合一般情況下,這些構(gòu)造對象的方法可以遞歸使用。A.4.4類型限定符對象的類型可以通過附加的限定符進行限定。聲明為const的對象表明此對象的值不可以修改;聲明為volatile的對象表明它具有與優(yōu)化相關的特殊屬性。限定符既不影響對象取值的范圍,也不影響其算術屬性。限定符將在A.8.2節(jié)中討論。A.5對象和左值對象是一個命名的存儲區(qū)域,左值(lvalue)是引用某個對象的表達式。具有合適類型與存儲類的標識符便是左值

8、表達式的一個明顯的例子。某些運算符可以產(chǎn)生左值。例如,如果E是一個指針類型的表達式,*E則是一個左值表達式,它引用由E指向的對象。名字“左值”來源于賦值表達式E1=E2,其中,左操作數(shù)E1必須是一個左值表達式。對每個運算符的討論需要說明此運算符是否需要一個左值操作數(shù)以及它是否產(chǎn)生一個左值。A.6轉(zhuǎn)換根據(jù)操作數(shù)的不同,某些運算符會引起操作數(shù)的值從某種類型轉(zhuǎn)換為另一種類型。本節(jié)將說明這種轉(zhuǎn)換產(chǎn)生的結(jié)果。A.6.5節(jié)將討論大多數(shù)普通運算符所要求的轉(zhuǎn)換,我們在講解每個運算符時將做一些補充。A.6.1整型提升在一個表達式中,凡是可以使用整型的地方都可以使用帶符號或無符號的字符、短整型或整型位字段,還可以

9、使用枚舉類型的對象。如果原始類型的所有值都可用int類型表示,則其值將被轉(zhuǎn)換為int類型;否則將被轉(zhuǎn)換為unsignedint類型。這一過程稱為整型提升(integralpromotion)。A.6.2整型轉(zhuǎn)換將任何整數(shù)轉(zhuǎn)換為某種指定的無符號類型數(shù)的方法是:以該無符號類型能夠表示的最大值加1為模,找出與此整數(shù)同余的最小的非負值。在對二的補碼表示中,如果該無符號類型的位模式較窄,這就相當于左截??;如果該無符號類型的位模式較寬,這就相當于對帶符號值進行符號擴展和對無符號值進行o填充。將任何整數(shù)轉(zhuǎn)換為帶符號類型時,如果它可以在新類型中表示出來,則其值保持不變,否則它的值同具體的實現(xiàn)有關。A.6.3整

10、數(shù)和浮點數(shù)當把浮點類型的值轉(zhuǎn)換為整型時,小數(shù)部分將被丟棄。如果結(jié)果值不能用整型表示,則其行為是未定義的。特別是,將負的浮點數(shù)轉(zhuǎn)換為無符號整型的結(jié)果是沒有定義的。當把整型值轉(zhuǎn)換為浮點類型時,如果該值在該浮點類型可表示的范圍內(nèi)但不能精確表示,則結(jié)果可能是下一個較高或較低的可表示值。如果該值超出可表示的范圍,則其行為是未定義的。A.6.4浮點類型將一個精度較低的浮點值轉(zhuǎn)換為相同或更高精度的浮點類型時,它的值保持不變。將一個較高精度的浮點類型值轉(zhuǎn)換為較低精度的浮點類型時,如果它的值在可表示范圍內(nèi),則結(jié)果可能是下一個較高或較低的可表示值。如果結(jié)果在可表示范圍之外,則其行為是未定義的。A.6.5算術類型轉(zhuǎn)

11、換有操作數(shù)轉(zhuǎn)換為同一公共類型,轉(zhuǎn)換。首先,如果任何一個操作數(shù)為許多運算符都會以類似的方式在運算過程中引起轉(zhuǎn)換,并產(chǎn)生結(jié)果類型。其效果是將所并以此作為結(jié)果的類型。這種方式的轉(zhuǎn)換稱為普通算術類型longdouble類型,則將另一個操作數(shù)轉(zhuǎn)換為longdouble類型。double類型,則將另一個操作數(shù)轉(zhuǎn)換為double類型。float類型,則將另一個操作數(shù)轉(zhuǎn)換為float類型。否則,如果任何一個操作數(shù)為否則,如果任何一個操作數(shù)為否則,同時對兩個操作數(shù)進行整型提升;然后,如果任何一個操作數(shù)為unsignedlongint類型,則將另一個操作數(shù)轉(zhuǎn)換為unsignedlongint類型。否則,如果一個操

12、作數(shù)為longint類型且另一個操作數(shù)為unsignedint類型,則結(jié)果依賴于longint類型是否可以表示所有的unsignedint類型的值。如果可以,則將unsignedint類型的操作數(shù)轉(zhuǎn)換為longint;如果不可以,則將兩個操作數(shù)都轉(zhuǎn)換為unsignedlongint類型。否則,如果一個操作數(shù)為longint類型,則將另一個操作數(shù)轉(zhuǎn)換為longint類型。否則,如果任何一個操作數(shù)為unsignedint類型,則將另一個操作數(shù)轉(zhuǎn)換為unsignedint類型。否則,將兩個操作數(shù)都轉(zhuǎn)換為int類型。說明:這里有兩個變化。第一,對float類型操作數(shù)的算術運算可以只用單精度而不是雙精度

13、;而在第1版中規(guī)定,所有的浮點運算都是雙精度。第二,當較短的無符號類型與較長的帶符號類型一起運算時,不將無符號類型的屬性傳遞給結(jié)果類型;而在第1版中,無符號類型總是處于支配地位。新規(guī)則稍微復雜一些,但減少了無符號數(shù)與帶符號數(shù)混合使用情況下的麻煩,當一個無符號表達式與一個具有同樣長度的帶符號表達式相比較時,結(jié)果仍然是無法預料的。A.6.6指針和整數(shù)指針可以加上或減去一個整型表達式。在這種情況下,整型表達式的轉(zhuǎn)換按照加法運算符的方式進行(參見A.7.7節(jié))。兩個指向同一數(shù)組中同一類型的對象的指針可以進行減法運算,其結(jié)果將被轉(zhuǎn)換為整型;轉(zhuǎn)換方式按照減法運算符的方式進行(參見A.7.7節(jié))。值為0的整

14、型常量表達式或強制轉(zhuǎn)換為void*類型的表達式可通過強制轉(zhuǎn)換、賦值或比較操作轉(zhuǎn)換為任意類型的指針。其結(jié)果將產(chǎn)生一個空指針,此空指針等于指向同一類型的另一空指針,但不等于任何指向函數(shù)或?qū)ο蟮闹羔?。還允許進行指針相關的其它某些轉(zhuǎn)換,但其結(jié)果依賴于具體的實現(xiàn)。這些轉(zhuǎn)換必須由一個顯式的類型轉(zhuǎn)換運算符或強制類型轉(zhuǎn)換來指定(參見A.7.5節(jié)和A.8.8節(jié))。指針可以轉(zhuǎn)換為整型,但此整型必須足夠大;所要求的大小依賴于具體的實現(xiàn)。映射函數(shù)也依賴于具體的實現(xiàn)。整型對象可以顯式地轉(zhuǎn)換為指針。這種映射總是將一個足夠?qū)挼膹闹羔樲D(zhuǎn)換來的整數(shù)轉(zhuǎn)換為同一個指針,其它情況依賴于具體的實現(xiàn)。指向某一類型的指針可以轉(zhuǎn)換為指向另一

15、類型的指針,但是,如果該指針指向的對象不滿足一定的存儲對齊要求,則結(jié)果指針可能會導致地址異常。指向某對象的指針可以轉(zhuǎn)換為一個指向具有更小或相同存儲對齊限制的對象的指針,并可以保證原封不動地再轉(zhuǎn)換回來?!皩R”的概念依賴于具體的實現(xiàn),但char類型的對象具有最小的對齊限制。我們將在A.6.8節(jié)的討論中看到,指針也可以轉(zhuǎn)換為void*類型,并可原圭寸不動地轉(zhuǎn)換回來。一個指針可以轉(zhuǎn)換為同類型的另一個指針,但增加或刪除了指針所指的對象類型的限定符(參見A.4.4節(jié)和A.8.2節(jié))的情況除外。如果增加了限定符,則新指針與原指針等價,不同的是增加了限定符帶來的限制。如果刪除了限定符,則對底層對象的運算仍受

16、實際聲明中的限定符的限制。最后,指向一個函數(shù)的指針可以轉(zhuǎn)換為指向另一個函數(shù)的指針。調(diào)用轉(zhuǎn)換后指針所指的函數(shù)的結(jié)果依賴于具體的實現(xiàn)。但是,如果轉(zhuǎn)換后的指針被重新轉(zhuǎn)換為原來的類型,則結(jié)果與原來的指針一致。A.6.7voidvoid對象的(不存在的)值不能夠以任何方式使用,也不能被顯式或隱式地轉(zhuǎn)換為任一非空類型。因為空(void)表達式表示一個不存在的值,這樣的表達式只可以用在不需要值的地方,例如作為一個表達式語句(參見A.9.2節(jié))或作為逗號運算符的左操作數(shù)(參見A.7.18節(jié))??梢酝ㄟ^強制類型轉(zhuǎn)換將表達式轉(zhuǎn)換為void類型。例如,在表達式語句中,一個空的強制類型轉(zhuǎn)換將丟掉函數(shù)調(diào)用的返回值。說明:void沒有在本書的第1版中出現(xiàn),但是在本書第1版出版后,它一直被廣泛使用著。A.6.8指向void的指針指向任何對象的指針都

溫馨提示

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

最新文檔

評論

0/150

提交評論