版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第二章C語(yǔ)言的基本數(shù)據(jù)類(lèi)型及運(yùn)算2.1標(biāo)識(shí)符與關(guān)鍵字
2.2數(shù)據(jù)類(lèi)型2.3常量2.4變量2.5運(yùn)算符2.6表達(dá)式2.7數(shù)據(jù)類(lèi)型、運(yùn)算符與表達(dá)式舉例習(xí)題2.1標(biāo)識(shí)符與關(guān)鍵字2.1.1標(biāo)識(shí)符標(biāo)識(shí)符是C語(yǔ)言編程時(shí)用來(lái)標(biāo)志識(shí)別的符號(hào)??梢远x各種標(biāo)識(shí)符作為變量名、數(shù)組名、函數(shù)名、標(biāo)號(hào)及用戶(hù)定義對(duì)象的名稱(chēng)。
ANSIC規(guī)定標(biāo)識(shí)符必須是由字母或下劃線(xiàn)開(kāi)頭,隨后跟字母,數(shù)字或下劃線(xiàn)任意組合而成的字符序列。下面是幾個(gè)正確與不正確的標(biāo)識(shí)符名稱(chēng):正確不正確Count 1counttest123 hi!therehigh_balancehigh..balancePIa+b
說(shuō)明:
(1)與有些程序設(shè)計(jì)語(yǔ)言的規(guī)定不同,在C語(yǔ)言中,標(biāo)識(shí)符中大小寫(xiě)字母是有區(qū)別的。程序中基本上都采用小寫(xiě)字母表示各種標(biāo)識(shí)符,如變量名、數(shù)組名、函數(shù)名等。書(shū)寫(xiě)的各種語(yǔ)句也均用小寫(xiě)字母,而大寫(xiě)字母只用來(lái)定義宏名等,用的不多。
(2)不同的系統(tǒng)對(duì)標(biāo)識(shí)符的長(zhǎng)度有不同的要求,有的要求為6個(gè)字符,有的允許使用8個(gè)字符,而VisualC++系統(tǒng)下的有效長(zhǎng)度為1~247個(gè)字符。
(3)除了少數(shù)工作單元我們用單個(gè)字符作標(biāo)識(shí)符,一般的應(yīng)做到見(jiàn)名知義,以提高程序的可讀性并易于與C++接軌。如用sum表示和,score表示成績(jī),max表示最大等等。2.1.2關(guān)鍵字
ANSIC規(guī)定了32個(gè)關(guān)鍵字(保留字),不能再用作各種標(biāo)識(shí)符。下面列出32個(gè)關(guān)鍵字:
auto,break,case,char,const,continue,default,do,double,else,enum,extern,float,for,goto,if,int,long,register,return,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile,while它們用來(lái)表示C語(yǔ)言本身的特定成分,具有相應(yīng)的語(yǔ)義,可構(gòu)成所有的C語(yǔ)言語(yǔ)句。
C語(yǔ)言還使用下列12個(gè)標(biāo)識(shí)符作為編譯預(yù)處理的命令單詞,但使用時(shí)前面應(yīng)加“#”:
define,elif,else,endif,error,if,ifdef,ifndef,include,line,progma,undef關(guān)鍵字或命令單詞后必須有空格、圓括號(hào)、尖括號(hào)、雙引號(hào)等分隔符,否則與其它字符一起組成新的標(biāo)識(shí)符。如#definePI3.1415。2.2數(shù)據(jù)類(lèi)型程序處理的對(duì)象是數(shù)據(jù)。數(shù)據(jù)有許多種類(lèi),例如數(shù)值數(shù)據(jù)、文字?jǐn)?shù)據(jù)、圖像數(shù)據(jù)以及聲音數(shù)據(jù)等,其中最基本的也是最常用的是數(shù)值數(shù)據(jù)和文字?jǐn)?shù)據(jù)。無(wú)論什么數(shù)據(jù),在對(duì)其進(jìn)行處理時(shí)都要先存放在內(nèi)存中。顯然,不同類(lèi)型的數(shù)據(jù)在存儲(chǔ)器中的存放格式也不相同。也就是說(shuō),不同類(lèi)型的數(shù)據(jù)所占內(nèi)存長(zhǎng)度可能不同,數(shù)據(jù)表達(dá)形式也可能不同,其值域(允許的取值范圍)也各不相同。在C語(yǔ)言中,數(shù)據(jù)類(lèi)型可分為基本類(lèi)型、構(gòu)造類(lèi)型和指針類(lèi)型三類(lèi),如圖2.1所示。圖2.1數(shù)據(jù)類(lèi)型的分類(lèi)2.2.1基本數(shù)據(jù)類(lèi)型
1.基本數(shù)據(jù)類(lèi)型的分類(lèi)在C語(yǔ)言中有四種基本數(shù)據(jù)類(lèi)型:字符型、整型、實(shí)型(單精度實(shí)型和雙精度實(shí)型)和無(wú)值型。通常情況下,這些數(shù)據(jù)類(lèi)型的長(zhǎng)度(占內(nèi)存二進(jìn)制位數(shù))和值域如表2.1所示。表2.1C語(yǔ)言基本數(shù)據(jù)類(lèi)型的長(zhǎng)度和值域字符型(char)變量用于存儲(chǔ)ASCII碼字符,也可存儲(chǔ)8位二進(jìn)制數(shù)。整型(int)變量用于存儲(chǔ)整數(shù)。因其字長(zhǎng)有限,故可表示的整數(shù)的范圍也有限。單精度實(shí)型(float)和雙精度實(shí)型(double)變量用于存儲(chǔ)實(shí)數(shù),實(shí)數(shù)具有整數(shù)和小數(shù)兩部分或是帶指數(shù)的數(shù)據(jù)。表中的值域用絕對(duì)值表示。無(wú)值型(void)有兩種用途:第一是明確地表示一個(gè)函數(shù)不返回任何值;第二是產(chǎn)生同一類(lèi)型的指針。這兩個(gè)用途都將在后續(xù)章節(jié)中討論。
2.類(lèi)型修飾符除了無(wú)值類(lèi)型外,基本數(shù)據(jù)類(lèi)型可以帶有各種修飾前綴。修飾符用于明確基本數(shù)據(jù)類(lèi)型的含義,以準(zhǔn)確地適應(yīng)不同情況下的要求。類(lèi)型修飾符種類(lèi)如下:
signed有符號(hào)
unsigned無(wú)符號(hào)
long長(zhǎng)
short短上述四個(gè)修飾符可用于字符型和整型的基本類(lèi)型,此外,long還可用于雙精度實(shí)型。整型數(shù)定義后的缺省狀態(tài)為signed和short型,故此二修飾符可省略。表2.2依據(jù)ANSI標(biāo)準(zhǔn)列舉了全部允許的數(shù)據(jù)類(lèi)型及它們的長(zhǎng)度和取值范圍。表2.2C語(yǔ)言基本類(lèi)型及其修飾符的所有組合2.2.2構(gòu)造數(shù)據(jù)類(lèi)型為了程序的處理方便,我們還需要構(gòu)造其它數(shù)據(jù)類(lèi)型來(lái)適應(yīng)我們的需要。如處理一個(gè)句子時(shí),用字符類(lèi)型就需要很多簡(jiǎn)單變量,非常不方便,此時(shí)我們就構(gòu)造一個(gè)字符數(shù)組(或字符串)來(lái)處理。數(shù)組是一組連續(xù)、有序的存放在一起的具有相同類(lèi)型的數(shù)據(jù)。結(jié)構(gòu)體是將不同類(lèi)型的數(shù)據(jù)按一定順序存放在一起的數(shù)據(jù)結(jié)構(gòu)。共用體是將不同類(lèi)型的數(shù)據(jù)都存放在同一起始地址的內(nèi)存單元中,共用一段內(nèi)存以節(jié)省內(nèi)存單元。枚舉,顧名思義,“枚”是量詞,相當(dāng)于“個(gè)”,“舉”是指將變量的值一一列舉出來(lái)。實(shí)際上是用符號(hào)來(lái)表示若干個(gè)可取的整型值,它是整型的一個(gè)子集。構(gòu)造類(lèi)型的內(nèi)容我們將在后續(xù)章節(jié)中詳細(xì)討論。2.2.3指針類(lèi)型指針是C語(yǔ)言中一個(gè)重要的概念。正確而靈活地運(yùn)用它,可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);能動(dòng)態(tài)分配內(nèi)存;能方便地使用字符串;能有效而方便地使用數(shù)組;在調(diào)用函數(shù)時(shí)能得到多于一個(gè)的值;能直接處理內(nèi)存地址等。指針類(lèi)型迥異于前述各種數(shù)據(jù)類(lèi)型,不管是簡(jiǎn)單類(lèi)型的數(shù)據(jù),還是構(gòu)造類(lèi)型數(shù)據(jù),均是代表數(shù)據(jù)的,而指針類(lèi)型是代表地址的。前述各種數(shù)據(jù)類(lèi)型均要存放在內(nèi)存中,不管其占用多少個(gè)內(nèi)存單元,其第一個(gè)單元的地址是最重要的,可以利用這個(gè)地址來(lái)引用該類(lèi)型的數(shù)據(jù),故可以將此首地址存放在一個(gè)變量中,這個(gè)變量即是指針型變量,我們簡(jiǎn)稱(chēng)指針。指針是C語(yǔ)言的特色所在,既是重點(diǎn)又是難點(diǎn),我們將在第八章詳細(xì)討論。2.3常量在C語(yǔ)言中,常量具有固定的值,且在程序運(yùn)行過(guò)程中保持不變。它們可以是任何一種類(lèi)型的數(shù)據(jù)。2.3.1數(shù)值常量數(shù)值常量我們平時(shí)也稱(chēng)為常數(shù)。從類(lèi)型分有整型常量、單精度實(shí)型常量和雙精度常量。
1.整型常量整型常量也稱(chēng)為整型常數(shù)或整數(shù)。
C整型常量按進(jìn)制分可分為十進(jìn)制整數(shù)、八進(jìn)制整數(shù)和十六進(jìn)制整數(shù)。
1)十進(jìn)制整數(shù)十進(jìn)制整數(shù)以正、負(fù)號(hào)開(kāi)頭,后跟0~9的若干位數(shù)字構(gòu)成。如123,-459,0等。采用不同整型數(shù)據(jù)類(lèi)型表示整數(shù)時(shí),由于不同類(lèi)型所占內(nèi)存空間大小不一樣,其表示范圍也不一樣。若占用字節(jié)數(shù)為n,則該整數(shù)的取值范圍為-2n-1~2n-1-1。如整型占兩個(gè)字節(jié),16位,則其取值范圍是-216-1~216-1-1,即在-32768~32767之間。
2)八進(jìn)制整數(shù)八進(jìn)制整數(shù)是以正、負(fù)號(hào)開(kāi)頭,第一位數(shù)字一定是0,作為八進(jìn)制的標(biāo)志,后面跟0~7的數(shù)字。如八進(jìn)制數(shù)0123,相當(dāng)于十進(jìn)制數(shù)83;八進(jìn)制數(shù)-012,相當(dāng)于十進(jìn)制數(shù)-10。
3)十六進(jìn)制整數(shù)十六進(jìn)制整數(shù)是以正、負(fù)號(hào)開(kāi)頭,前兩位為0x,后面跟0~9和a~f的數(shù)字。其中a代表10,b代表11,其余類(lèi)推。如十六進(jìn)制數(shù)0x123,相當(dāng)于十進(jìn)制數(shù)291;十六進(jìn)制數(shù)-0x12,相當(dāng)于十進(jìn)制數(shù)-18。
4)二進(jìn)制數(shù)、字節(jié)、字、位計(jì)算機(jī)內(nèi)所有的信息均用二進(jìn)制表示,即計(jì)算機(jī)內(nèi)只有0和1,也只認(rèn)識(shí)由0和1組成的程序或數(shù)據(jù)。為什么在計(jì)算機(jī)中要使用二進(jìn)制數(shù)呢?因?yàn)槎M(jìn)制數(shù)運(yùn)算規(guī)則簡(jiǎn)單,用物理器材容易實(shí)現(xiàn),如電壓的高與低,開(kāi)關(guān)的開(kāi)與關(guān),脈沖的有與無(wú)等等。一個(gè)二進(jìn)制數(shù)0或1,稱(chēng)為“位”(bit)。在計(jì)算機(jī)存儲(chǔ)器中,為了便于管理,常將8個(gè)位稱(chēng)為一個(gè)“字節(jié)”(byte),每個(gè)字節(jié)存放在一個(gè)存儲(chǔ)單元中,每個(gè)單元賦于一個(gè)存儲(chǔ)地址。由于二進(jìn)制數(shù)位數(shù)太長(zhǎng),不易閱讀,習(xí)慣上常用十進(jìn)制表示數(shù)據(jù),用十六進(jìn)制來(lái)表示地址,編譯程序會(huì)將其“翻譯”成用二進(jìn)制表示的機(jī)器指令。實(shí)際上,任何語(yǔ)言編寫(xiě)的程序,無(wú)論是BASIC、Pascal等高級(jí)語(yǔ)言,還是像C這樣的中級(jí)語(yǔ)言,甚至已很接近機(jī)器語(yǔ)言的匯編語(yǔ)言都要翻譯成二進(jìn)制的機(jī)器語(yǔ)言,才能在計(jì)算機(jī)上運(yùn)行。
2.單精度實(shí)型常量單精度實(shí)型常量也稱(chēng)為實(shí)數(shù)或浮點(diǎn)數(shù)。實(shí)數(shù)有兩種表示形式:小數(shù)形式和指數(shù)形式。
1)小數(shù)形式一個(gè)實(shí)數(shù)可以是正、負(fù)號(hào)開(kāi)頭,有若干位0~9的整數(shù),后跟一個(gè)小數(shù)點(diǎn)(必須有),再有若干位小數(shù)部分。如123.456,-21.37。數(shù)12用實(shí)數(shù)表示必須寫(xiě)成12.0或12.。一個(gè)實(shí)數(shù)有數(shù)值范圍和有效位數(shù)的限制。實(shí)數(shù)的數(shù)值范圍是3.4×10-38≤|x|≤3.4×1038,當(dāng)小于3.4×10-38時(shí)按0對(duì)待(下溢),而大于3.4×1038時(shí)則上溢,一個(gè)溢出的數(shù)是無(wú)意義的。實(shí)數(shù)僅有7位有效數(shù)字,超過(guò)七位的將是不精確的。如1.2345678,在計(jì)算機(jī)內(nèi)僅保留為1.234567,第八位數(shù)無(wú)法保留而失去,并不是第八位向第七位四舍五入。當(dāng)上面的數(shù)要求用小數(shù)五位表示時(shí),則表達(dá)為1.23457,即第七位向第六位四舍五入。
2)指數(shù)形式實(shí)數(shù)的指數(shù)形式也稱(chēng)為科學(xué)計(jì)數(shù)法。一個(gè)實(shí)數(shù)的指數(shù)形式分成尾數(shù)部分和指數(shù)部分。尾數(shù)部分可以是整數(shù)形式或小數(shù)形式,指數(shù)部分是一個(gè)字母“e”后跟一個(gè)整數(shù)。如123e+01,-456.78e-01,0e0等。由于實(shí)數(shù)僅有7位有效數(shù)字,因此在內(nèi)存中用三個(gè)字節(jié)來(lái)表示尾數(shù),用一個(gè)字節(jié)來(lái)表示指數(shù),所以指數(shù)部分用兩位整數(shù)來(lái)表示。
3.雙精度常量當(dāng)要表示的實(shí)數(shù)超過(guò)3.4×1038時(shí),我們可以用雙精度常量來(lái)表達(dá)。雙精度常量的取值范圍由1.7×10-308≤|x|≤1.7×10308,有效位可達(dá)16位左右。一個(gè)數(shù)當(dāng)超過(guò)長(zhǎng)整型數(shù)表達(dá)范圍或超過(guò)實(shí)數(shù)表達(dá)范圍時(shí)均按雙精度常量對(duì)待。一個(gè)雙精度常量在內(nèi)存中占8個(gè)字節(jié)。2.3.2字符常量
C中如′a′,′A′,′+′,′?′等用單引號(hào)括起來(lái)的一個(gè)字符都是字符常量,它們以其ASCII碼形式存儲(chǔ)在內(nèi)存中,每個(gè)字符在內(nèi)存中占一個(gè)字節(jié),而′a′和′A′是不同的字符常量。注意,字符常量在單引號(hào)內(nèi)只是一個(gè)字符,當(dāng)多于一個(gè)字符時(shí)是非法的。
C的字符常量除了用單引號(hào)括起來(lái)的一個(gè)字符外,還有一類(lèi)稱(chēng)為控制字符常量或轉(zhuǎn)義字符常量,它們?cè)诒磉_(dá)時(shí),單引號(hào)內(nèi)是以“\”開(kāi)頭后跟轉(zhuǎn)義字符,或八進(jìn)制數(shù),或十六進(jìn)制數(shù),它們可以是一類(lèi)不可打印字符,代表某些功能,因此稱(chēng)為轉(zhuǎn)義字符。具體內(nèi)容如表2.3所示。表2.3控制字符表示法用八進(jìn)制數(shù)或十六進(jìn)制數(shù)構(gòu)造的轉(zhuǎn)義字符可以用來(lái)表示所有的ASCII碼和代碼范圍在128~255之間的擴(kuò)展ASCII碼。如′\101′代表字符′A′;′\0′或′\000′代表ASCII碼為0的控制字符,即“空操作”字符;′\x0A′代表?yè)Q行;′\x41′代表字符′A′。2.3.3字符串常量當(dāng)要使用一個(gè)字符序列時(shí),我們就要使用字符串常量。字符串常量是用一對(duì)雙引號(hào)括起來(lái)的字符序列。如"ABC","x+y=6","Howdoyoudo."等都是字符串常量。我們不要混淆字符常量和字符串常量?!鋋′是字符常量,"a"是字符串常量,二者是不同的。字符常量在內(nèi)存中僅占一個(gè)字節(jié),而字符串常量則由系統(tǒng)在字符序列最后加一個(gè)字符′\0′來(lái)表示字符串的結(jié)束。因此"a"在內(nèi)存中占兩個(gè)字節(jié),即2.4變量在程序中,其值可以改變的量稱(chēng)為變量。一個(gè)變量有兩個(gè)要素:一個(gè)是變量名,我們用標(biāo)識(shí)符來(lái)表示它,一般變量名均由小寫(xiě)字母組成;另一個(gè)是變量在內(nèi)存中要占據(jù)若干字節(jié)的存儲(chǔ)單元。在C程序中,變量需先定義,后使用,并在同一層次中不能與其它標(biāo)識(shí)符重名。2.4.1變量的定義
1.變量定義變量定義的一般形式如下:類(lèi)型變量名表;這里,類(lèi)型(type)必須是C語(yǔ)言的有效數(shù)據(jù)類(lèi)型。變量名表可以是一個(gè)或多個(gè)標(biāo)識(shí)符名,中間用逗號(hào)分隔,最后以分號(hào)結(jié)束。以下是一些變量定義的例子:
inti,j,num;
floata,b,sum;
unsignedintui;
charc,ch,name;
doublex,total;
2.說(shuō)明
(1)變量名可以是C語(yǔ)言中允許的合法標(biāo)識(shí)符,用戶(hù)定義時(shí)應(yīng)遵循“見(jiàn)名知義”的原則,以利于程序的維護(hù)(今后所有標(biāo)識(shí)符均如此,不再重復(fù))。
(2)每一個(gè)變量都必須進(jìn)行類(lèi)型說(shuō)明,這樣就可以保證程序中變量的正確使用。未經(jīng)類(lèi)型說(shuō)明的變量在編譯時(shí)將被指出是錯(cuò)誤的,也就是變量一定要先定義,后使用。
(3)當(dāng)一個(gè)變量被指定為某一確定類(lèi)型時(shí),將為它分配若干相應(yīng)字節(jié)的內(nèi)存空間。如char型為1字節(jié),int型為2字節(jié),float型為4字節(jié),double型為8字節(jié)。當(dāng)然,不同的系統(tǒng)可能稍有差異。
(4)變量可以在程序內(nèi)的三個(gè)地方定義:在函數(shù)內(nèi)部,在函數(shù)的參數(shù)(形參)定義中或在所有的函數(shù)外部。由此定義的變量分別稱(chēng)為局部變量、形式參數(shù)和全局變量。在不同地方定義的變量,其作用范圍不同。在同一層次定義的變量,不能與數(shù)組、指針、函數(shù)或其它變量同名。
(5)變量是用來(lái)存放數(shù)據(jù)的,由于數(shù)據(jù)有不同的類(lèi)型,因此要定義相應(yīng)類(lèi)型的變量去存放它。這些數(shù)據(jù)稱(chēng)為相應(yīng)變量的值。如系統(tǒng)運(yùn)行inta;a=5;后會(huì)將內(nèi)存中的若干個(gè)單元分配給變量a,并將變量的值5放入內(nèi)存中。需要說(shuō)明的是,不同的系統(tǒng)分配給同類(lèi)型變量的單元數(shù)是不同的。如在TurboC系統(tǒng)中,給int型變量分配2個(gè)字節(jié),而在VisualC++6.0系統(tǒng)中,給int型變量則分配4個(gè)字節(jié)。這一點(diǎn),我們將在后續(xù)章節(jié)中進(jìn)一步體會(huì)。2.4.2C語(yǔ)言中各種類(lèi)型的變量
1.整型變量整型變量用來(lái)存放整型數(shù)值。整型變量可分為:基本型(int),短整型(shortint或short),長(zhǎng)整型(longint或long)和無(wú)符號(hào)型(unsignedint,unsignedshort,unsignedlong)。前三種整型變量存儲(chǔ)單元的最高位為符號(hào)位。0表示為正,1表示為負(fù)。無(wú)符號(hào)型變量存儲(chǔ)單元的所有位均表示數(shù)值。具體可參看表2.2。在使用整型變量時(shí)一定要注意數(shù)值的范圍,超過(guò)該變量允許的使用范圍將導(dǎo)致錯(cuò)誤的結(jié)果。
2.實(shí)型變量實(shí)型變量分為單精度型(float)和雙精度型(double)兩類(lèi)。其存放數(shù)據(jù)的差別是:?jiǎn)尉茸兞空?個(gè)字節(jié)內(nèi)存單元,有7位有效數(shù)字,數(shù)值范圍在3.4e-38~3.4e+38之間。而雙精度變量占有8個(gè)字節(jié)內(nèi)存單元,有15~16位有效數(shù)字,數(shù)值范圍在1.7e-308~1.7e+308之間。雙精度型變量還有一種長(zhǎng)雙精度型(longdouble),由于使用較少,又由計(jì)算機(jī)系統(tǒng)決定,因此就不介紹了。一個(gè)實(shí)型常量可以賦給單精度型變量,也可賦給雙精度型變量,主要是保留的有效位數(shù)不同。
3.字符型變量字符型(char)變量?jī)?nèi)存放字符型常量,在內(nèi)存單元中僅占一個(gè)字節(jié)。其內(nèi)存中存放的是該字符的ASCII碼,因此字符型變量也可存儲(chǔ)數(shù)值范圍為0~255或-128~127之間的整型常數(shù)。在C語(yǔ)言中,字符型與整型的界限不是很分明的,在一個(gè)字節(jié)內(nèi)內(nèi)存中存放的形式是相同的。
4.枚舉型變量枚舉型是一個(gè)整型常量的集合。這些常量指定了所有該類(lèi)型變量可能具有的各種合法值。枚舉在我們?nèi)粘I钪惺殖R?jiàn)。例如,星期的枚舉為{Sunday,Monday,Tuesday,Wednesday,Thursday,F(xiàn)riday,Saturday}。枚舉的定義形式是:
enum〈枚舉類(lèi)型名〉{枚舉元素表}〈變量表〉;其中枚舉類(lèi)型名和枚舉變量表是選擇項(xiàng)。下面我們來(lái)看一個(gè)枚舉類(lèi)型的定義和變量定義的例子:
enumweekday{sun,mon,tue,wed,thu,fri,sat};
enumweekdayworkday,restday;其中第一句是定義枚舉類(lèi)型enumweekday,weekday是枚舉類(lèi)型名,而花括號(hào)內(nèi)是該枚舉型變量可能具有的各種情況的一一列舉。第二句是定義枚舉型變量,即變量workday,restday是屬于enumweekday枚舉類(lèi)型的,該枚舉型變量只能賦予花括號(hào)內(nèi)的常量,例如:
workday=mon;
restday=sun;枚舉類(lèi)型的定義和變量的定義有三種形式:
(1)上面舉例即是,即枚舉類(lèi)型和枚舉變量是分別定義的。
(2)可將上述形式合并成一句:
enumweekday{sun,mon,tue,wed,thu,fri,sat}workdayrestday;
(3)當(dāng)只有一種枚舉類(lèi)型時(shí),可省略枚舉類(lèi)型名:
enum{sun,mon,tue,wed,thu,fri,sat}workday,restday;其中花括號(hào)內(nèi)所列的元素稱(chēng)為枚舉元素或枚舉常量。它們是用戶(hù)定義的標(biāo)識(shí)符,這些標(biāo)識(shí)符并不自動(dòng)地代表什么含義。如sun也可寫(xiě)成sunday,用什么標(biāo)識(shí)符代表什么含義,完全由程序員決定,只是為了使程序易懂,在某些情況下,較使用整型編程更好。正確理解枚舉的關(guān)鍵是:枚舉元素實(shí)際上是用它們所對(duì)應(yīng)的整型數(shù)來(lái)代替,即枚舉類(lèi)型只是整型的一個(gè)子集,且可以在任何一個(gè)整型表達(dá)式中使用這些枚舉值。具體的枚舉元素對(duì)應(yīng)的整數(shù)由兩種情況決定:
(1)缺?。寒?dāng)花括號(hào)內(nèi)的枚舉元素沒(méi)有被初始化,第一項(xiàng)代表整數(shù)0,第二項(xiàng)代表整數(shù)1,以此類(lèi)推。
(2)初始化:我們可以用初始化來(lái)改變枚舉元素的相應(yīng)值。例如:
enumweekday{mon=1,tue,wed,thu,fri,sat,sun}workday,restday;在上句中,mon代表1,后面仍然自動(dòng)增1,即tue代表2,sat代表6,而sun在此不代表0而代表7。初值可以從任何一個(gè)整數(shù)開(kāi)始,也可以指定幾個(gè)初值,也可給任何一個(gè)枚舉常量賦初值。例如:
enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat};此后sun為7,mon為1,tue為2,…,sat為6。枚舉型變量值在輸出時(shí)是輸出其整常數(shù)而不是其枚舉元素的標(biāo)識(shí)符。枚舉型變量在賦值時(shí)可以賦枚舉元素而不能直接賦整型常量,如要賦整型常量,則要進(jìn)行類(lèi)型轉(zhuǎn)換。例如:
restday=(enumweekday)6;或restday=sat;
例2.1
打印出枚舉元素sat的內(nèi)存值。程序:
#include<stdio.h>
voidmain()
{
enum{sun,mon,tue,wed,thu,fri,sat}workday,restday;
restday=sat;
printf("restdayis%d\n",restday);
}運(yùn)行:
restdayis6
5.其它類(lèi)型變量
C語(yǔ)言中無(wú)字符串變量,但可以用字符數(shù)組或字符型指針來(lái)表達(dá)字符串。另外還有指針型變量、結(jié)構(gòu)體型變量、共用體型變量等,這些將在后續(xù)章節(jié)中介紹。
C語(yǔ)言中沒(méi)有邏輯型變量,所有非零數(shù)值被認(rèn)為是邏輯“真”,而數(shù)值零被認(rèn)為是邏輯“假”。無(wú)值型類(lèi)型一般不用來(lái)說(shuō)明變量,只用在函數(shù)或指針中。2.4.3變量的初始化程序中常需要對(duì)一些變量預(yù)先設(shè)置初值。C規(guī)定,可以在定義變量時(shí)同時(shí)使變量初始化。變量初始化只需定義變量時(shí)在變量名后面加一等號(hào)及一個(gè)常數(shù)。它的一般形式是:類(lèi)型變量名=常數(shù);以下是幾個(gè)示例(第七章將詳述):
charch=′a′;
intfirst=0;
floatx=123.45;
說(shuō)明:
(1)全程和靜態(tài)變量在程序編譯階段初始化,且只賦一次值。而局部變量是在進(jìn)入定義它們的函數(shù)或復(fù)合語(yǔ)句時(shí)才作初始化,相當(dāng)于賦值語(yǔ)句。每調(diào)用一次,就賦值一次。
(2)所有的全程和靜態(tài)變量在沒(méi)有明確初始化的情況下由程序自動(dòng)賦零。而局部變量和寄存器變量在未初始化時(shí)其值是不確定的,即保持原來(lái)的狀態(tài)不變。2.5運(yùn)算符運(yùn)算符是一種向編譯程序說(shuō)明一個(gè)特定的數(shù)學(xué)或邏輯運(yùn)算的符號(hào)。C語(yǔ)言的運(yùn)算符很豐富,除了控制語(yǔ)句和輸入/輸出以外的幾乎所有的基本操作都可作為運(yùn)算符處理。C語(yǔ)言的運(yùn)算符有以下幾類(lèi):
(1)算術(shù)運(yùn)算符(+,-,*,/,%,++,--)。
(2)關(guān)系運(yùn)算符(<,>,<=,>=,==,![KG-*8]=)。
(3)邏輯運(yùn)算符(!,&&,||)。
(4)位運(yùn)算符(<<,>>,~,|,^,&)。
(5)賦值運(yùn)算符(=,及其雙目運(yùn)算符的擴(kuò)展賦值運(yùn)算符)。
(6)條件運(yùn)算符(?:)。
(7)逗號(hào)運(yùn)算符(,)。
(8)指針運(yùn)算符(*,&)。
(9)求字節(jié)數(shù)運(yùn)算符(sizeof)。
(10)強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符((類(lèi)型))。
(11)分量運(yùn)算符(·,->)。
(12)下標(biāo)運(yùn)算符([])。
(13)圓括號(hào)運(yùn)算符(())。2.5.1算術(shù)運(yùn)算符和賦值運(yùn)算符具體運(yùn)算符的功能、優(yōu)先級(jí)、運(yùn)算結(jié)合方向見(jiàn)表2.4所示。表2.4算術(shù)運(yùn)算符和賦值運(yùn)算符
說(shuō)明:
(1)+,-,*,/與數(shù)學(xué)中運(yùn)算類(lèi)似,先乘除后加減,也就是按優(yōu)先級(jí)順序進(jìn)行運(yùn)算,優(yōu)先級(jí)小的先運(yùn)算。要改變運(yùn)算順序只要加括號(hào)就可以了,括號(hào)全部為圓括號(hào),必須注意括號(hào)的配對(duì),圓括號(hào)適用于C的幾乎全部數(shù)據(jù)類(lèi)型(指針類(lèi)除外)的各種運(yùn)算(++,--除外)。除法運(yùn)算符(/)在用于兩個(gè)整型數(shù)據(jù)運(yùn)算時(shí),其運(yùn)算結(jié)果也是整數(shù),余數(shù)總是被截掉。如1/2的結(jié)果是0;10/3的結(jié)果是3。
(2)求余運(yùn)算符(%)僅用于整型數(shù)據(jù),不能用于實(shí)型和雙精度實(shí)型。它的作用是取整數(shù)除法的余數(shù)。如1%2的結(jié)果是1;10%3的結(jié)果也是1。
(3)賦值運(yùn)算符(=)是將右邊表達(dá)式的值賦給左邊的變量。賦值運(yùn)算符左邊必須是變量等有存儲(chǔ)單元的元素,而不能是常量或表達(dá)式。如x=x+1是合法的,即把x的值加上1后再賦給x,而x+1=x卻是非法的,因?yàn)閤+1不是一個(gè)存儲(chǔ)單元,不能被賦以值。賦值號(hào)有別于數(shù)學(xué)中的等號(hào),這一點(diǎn)是要注意的。
(4)++,--僅用于整型變量、指針變量。用于整型變量是在原值上加1或減1;用于指針變量是取下一地址或上一地址。關(guān)于指針部分的使用在第八章中介紹。增1和減1運(yùn)算符用在表達(dá)式中時(shí),寫(xiě)法是有差別的:如果運(yùn)算符在操作數(shù)前面,則在表達(dá)式“引用”該操作數(shù)前,先對(duì)其作加1或減1運(yùn)算;如果運(yùn)算符在操作數(shù)之后,則先“引用”該操作數(shù),然后再對(duì)它作加1或減1運(yùn)算??紤]以下程序:
#include<stdio.h>
voidmain()
{
intx,y;
x=10;
y=++x;
printf("x=%d,y=%d\n",x,y);
}運(yùn)算結(jié)果:
x=11,y=11此時(shí)y的值和x的值都為11。然而換一種寫(xiě)法:
#include<stdio.h>
voidmain()
{
intx,y;
x=10;
y=x++;
printf("x=%d,y=%d\n",x,y);
}運(yùn)行結(jié)果:
x=11,y=10此時(shí)y的值是10,而x的值自增后為11。上述兩種情況x都變成了11,而y的值卻不同。它們的差別只在于給x加1的時(shí)機(jī)不同。此時(shí)賦值即為引用。再如進(jìn)行輸出操作時(shí),有以下程序段:
x=10;
printf("x=%d\n",++x);運(yùn)行結(jié)果為x=11,執(zhí)行其下一條語(yǔ)句時(shí)x也是11,而程序段:
x=10;
printf("x=%d\n",x++);運(yùn)行結(jié)果為x=10,執(zhí)行下一條語(yǔ)句時(shí)x才是11,此時(shí)輸出即為引用。C語(yǔ)言可以控制何時(shí)給變量加1或減1,這是一個(gè)很大的優(yōu)點(diǎn),但有時(shí)也會(huì)帶來(lái)副作用,初學(xué)者要小心使用。
(5)+,-,*,/,%可以與賦值號(hào)=組成復(fù)合賦值運(yùn)算符+=,-=,*=,/=,%=。如a=a+b可以寫(xiě)成a+=b,a=a*b可以寫(xiě)成a*=b。其余類(lèi)推。這樣書(shū)寫(xiě)簡(jiǎn)練,運(yùn)行速度快,也提高了編譯效率。
例2.2
已知:inta=2,b=3,c=4。求:a*=16+(b++)-(++c)解a=a*(16+3-5)=2×14=282.5.2關(guān)系運(yùn)算符和邏輯運(yùn)算符
C語(yǔ)言所允許的關(guān)系運(yùn)算符有<,>,<=,>=,==和!六種。而邏輯運(yùn)算符有!,&&和||三種。在關(guān)系運(yùn)算符這一術(shù)語(yǔ)中,關(guān)系一詞是指數(shù)值與數(shù)值之間的關(guān)系,而在邏輯運(yùn)算符這一術(shù)語(yǔ)中,邏輯一詞是指如何用形式邏輯原則來(lái)建立數(shù)值間的關(guān)系。由于這兩種運(yùn)算符經(jīng)常在一起使用,因此我們一起討論。關(guān)系運(yùn)算符的運(yùn)算對(duì)象是數(shù)值(包括字符數(shù)據(jù)),運(yùn)算結(jié)果是一個(gè)邏輯量;邏輯運(yùn)算符的運(yùn)算對(duì)象和運(yùn)算結(jié)果都是邏輯量。邏輯常量實(shí)際上只有真(true)和假(false),但在C語(yǔ)言中,沒(méi)有專(zhuān)門(mén)設(shè)邏輯量,而是用零和非零來(lái)代替,true是不為零的任何值,而false是零,這樣任何數(shù)值均可進(jìn)行邏輯運(yùn)算。如8&&9是合法的。這使C的表達(dá)非常靈活。使用關(guān)系運(yùn)算符和邏輯運(yùn)算符的表達(dá)式的值卻很規(guī)范,系統(tǒng)只會(huì)給出兩個(gè)值:結(jié)果為false則返回0,而為true則返回1。表2.5列出了關(guān)系運(yùn)算符和邏輯運(yùn)算符的作用、運(yùn)算對(duì)象、優(yōu)先級(jí)和結(jié)合方向。表2.5關(guān)系和邏輯運(yùn)算符
說(shuō)明:
(1)當(dāng)關(guān)系運(yùn)算符兩邊的值滿(mǎn)足關(guān)系時(shí)為真,返回1;如不滿(mǎn)足關(guān)系時(shí)為假,返回0。例如:
x=10;
printf("%d\n",x>=9);則輸出為1。又如:
x=5;
printf("%d\n",x>=9);則輸出為0。字符比較按其ASCII碼值進(jìn)行,如′A′<′B′為真。
(2)關(guān)系運(yùn)算符>,>=,<,<=的優(yōu)先級(jí)相同,如在表達(dá)式中同時(shí)出現(xiàn)時(shí),則自左向右順序運(yùn)算。而==與!=則優(yōu)先級(jí)低于此四種關(guān)系運(yùn)算符。例如:
printf("%d\n",5>3>1);運(yùn)行輸出結(jié)果為0。因?yàn)閮蓚€(gè)>是同一優(yōu)先級(jí),5>3的結(jié)果為1,而1>1的關(guān)系不滿(mǎn)足,所以最后結(jié)果為0。又如:
printf("%d\n",1==11<35);運(yùn)行輸出結(jié)果為1。因?yàn)?lt;的優(yōu)先級(jí)比==高,則11<35的結(jié)果為1,而1==1的關(guān)系滿(mǎn)足,所以最后結(jié)果為1。
(3)邏輯運(yùn)算的真值表如下所示,邏輯值用1和0表示。
(4)關(guān)系和邏輯運(yùn)算符的優(yōu)先級(jí)都低于算術(shù)運(yùn)算符(邏輯非!除外)。如10>1+12完全等價(jià)于10>(1+12),其結(jié)果當(dāng)然是假(即0)。
(5)在關(guān)系和邏輯運(yùn)算符組成的表達(dá)式中,也可以像算術(shù)表達(dá)式一樣,用圓括號(hào)來(lái)改變運(yùn)算的自然優(yōu)先次序,如!1&&0其值為假,因?yàn)橄葓?zhí)行!1,然后才執(zhí)行&&。然而加上圓括號(hào)!(1&&0)后改變了運(yùn)算順序,則執(zhí)行!0操作結(jié)果為1,即其值為真。
(6)在邏輯表達(dá)式的求解中,并不是所有的邏輯運(yùn)算符都被執(zhí)行,只是在必須執(zhí)行下一個(gè)邏輯運(yùn)算符才能求出表達(dá)式的值時(shí),才執(zhí)行該運(yùn)算符。例如:當(dāng)兩個(gè)邏輯量a||b,且a為真時(shí)則不再求b的值,而取值為真(即1);當(dāng)兩個(gè)邏輯量a&&b,且a為假時(shí),則同樣不再求b的值,而取值為假(即0)。同理,a||b||c式中當(dāng)a為真時(shí),直接取值為真(即1);a&&(b++)&&c式中當(dāng)a為假時(shí),直接取值為假(即0)。此時(shí)b++操作就沒(méi)有進(jìn)行,下一條語(yǔ)句中b仍為原值。
(7)邏輯運(yùn)算的轉(zhuǎn)換。
!(a||b)可寫(xiě)成!a&&!b,而!(a&&b)可寫(xiě)成!a||!b。例2.3求表達(dá)式5<4||8>4-!0的值。解自左至右,按優(yōu)先級(jí)順序(<,!,-,>,||)計(jì)算 5<4 得0 !0 得1(自右至左) 4-!0 得3 8>4-!0 得1最后 0||1 得1即表達(dá)式的值為1。2.5.3位運(yùn)算符
C語(yǔ)言和其它高級(jí)語(yǔ)言不同,它完全支持位運(yùn)算。C語(yǔ)言可用來(lái)代替匯編語(yǔ)言完成大部分編程工作,位運(yùn)算功不可沒(méi)。位運(yùn)算是對(duì)字節(jié)或字中的實(shí)際二進(jìn)制位進(jìn)行檢測(cè)、設(shè)置或移位。這些字節(jié)或字必須是char型、int型數(shù)據(jù)類(lèi)型和它們的變體。位運(yùn)算符不能用于float,double,void或其它更復(fù)雜的數(shù)據(jù)類(lèi)型。
C語(yǔ)言中位運(yùn)算符有&,|,^,~,>>,<<等六種。位運(yùn)算的對(duì)象一定要按二進(jìn)制位表示出來(lái),否則就會(huì)混同于邏輯運(yùn)算符!,&&,||。表2.6列出了位運(yùn)算符的作用、運(yùn)算對(duì)象、運(yùn)算優(yōu)先級(jí)和結(jié)合方向。表2.6位運(yùn)算符
說(shuō)明:
(1)位邏輯運(yùn)算符&(與AND),|(或OR),^(異或XOR),~(反NOT)的真值表如下:真值表似乎與邏輯運(yùn)算符&&,||,!類(lèi)似,實(shí)質(zhì)上運(yùn)算中的對(duì)象是不同的。上述真值表中的P,Q是一個(gè)二進(jìn)制位,而不是字節(jié)或字。如3&&4,即兩個(gè)真值true相與,結(jié)果為1。但3&4卻要按位表示,即其結(jié)果是0。
(2)位邏輯運(yùn)算符&(與AND)常用于指定某些位清零。如使整型變量x清零,只要寫(xiě)成x=x&0就可以了;如果使一個(gè)字節(jié)的第8位表示為奇偶校驗(yàn)位并將其設(shè)為0,只要ch&127就可以了。而要保留某些位,只要這幾位和1相與,其它位與0相與即可。如要求對(duì)10011100保留低4位,高4位清零,我們?nèi)?0001111和原數(shù)按位相與,即得00001100。
(3)位邏輯運(yùn)算符|(或OR)可用于指定某些位為1。如要使10011100的低4位全為1,保留高4位,我們?nèi)?0001111和原數(shù)按位相或,即得100111111。
(4)位邏輯運(yùn)算符^(異或XOR)。①使特定位反轉(zhuǎn),只要將該位與1異或即可。如10011101要將低2位都反轉(zhuǎn),我們?nèi)?0000011與其按位異或,即得10011110。②使某些位保留原值,只要將這些位與0異或即可。如上例中的高6位。③整個(gè)數(shù)清零,只要本身異或一次即可,即x^x。如x為10011100,則x^x得0。④交換兩個(gè)值不用臨時(shí)變量。如a=3,b=4,則a=a^b,b=b^a,a=a^b,即a變成4,b變成3。具體請(qǐng)看下列式子:
(5)位邏輯運(yùn)算符~(反NOT)是對(duì)該運(yùn)算元素每一位都取反。如~1在8位二進(jìn)制數(shù)中變成了1111110而不是0。如我們要指定某數(shù)x最后一位為0(偶數(shù)),但又不知該數(shù)是1字節(jié)(char型)、2字節(jié)(int型)還是4字節(jié)(long型),我們只要做x&~1即可。這常用于不同機(jī)器間的程序移植。還可用于加密:對(duì)一個(gè)數(shù)求一次反碼就變成密碼,再對(duì)密碼求一次反就變成原數(shù)了。
(6)左移運(yùn)算符<<使變量中的每一位向左移動(dòng),移出的最高位將丟失(溢出),而右端補(bǔ)入0。左移表達(dá)式的形式為變量名<<移位的位數(shù)例如:a=15,即00001111,取a=a<<2后,即a左移兩位,變成00111100,即十進(jìn)制數(shù)60。對(duì)于無(wú)符號(hào)數(shù),左移一位相當(dāng)于乘2,左移2位相當(dāng)于乘4。
(7)右移運(yùn)算符>>使變量中的每一位向右移動(dòng),移出的最低位將丟失,而高端補(bǔ)0(正數(shù))。對(duì)于負(fù)數(shù),即原最高位為1時(shí),右移一位,高端補(bǔ)0稱(chēng)邏輯右移,高端補(bǔ)1稱(chēng)算術(shù)右移,這由計(jì)算機(jī)系統(tǒng)決定。對(duì)于VisualC++是采用算術(shù)右移,即移入1。右移表達(dá)式的形式為變量名>>移位的位數(shù)例如:a=16,即00001000,取a=a>>2后,即a右移2位,變?yōu)?0000010,即十進(jìn)制數(shù)4。右移一位相當(dāng)于除2,右移兩位相當(dāng)于除4。
(8)位運(yùn)算符中&,|,^,<<,>>可以與賦值號(hào)“=”組成復(fù)合賦值運(yùn)算符&=,|=,[HT4"]^[HT5]=,<<=,>>=。如a=a&b可寫(xiě)成a&=b,其余類(lèi)推。凡算術(shù)運(yùn)算符、位運(yùn)算符中的二目運(yùn)算符均可與賦值號(hào)“=”組成復(fù)合運(yùn)算符。位運(yùn)算在后續(xù)課程“微機(jī)原理與應(yīng)用”中將會(huì)更多地運(yùn)用。2.5.4條件運(yùn)算符和逗號(hào)運(yùn)算符
1.條件運(yùn)算符
C語(yǔ)言提供了一個(gè)功能很強(qiáng),使用靈活的條件運(yùn)算符“?:”,它是C中惟一的一個(gè)三目運(yùn)算符,即運(yùn)算對(duì)象有三個(gè),運(yùn)算優(yōu)先級(jí)為13,結(jié)合方向是自右至左。這個(gè)運(yùn)算符的一般形式是:表達(dá)式1?表達(dá)式2:表達(dá)式3其含義是:先求表達(dá)式1的值,如果為真(非零),則求表達(dá)式2的值,并把它作為整個(gè)表達(dá)式的值;如表達(dá)式1的值為假(零),則求表達(dá)式3的值,并把它作為整個(gè)表達(dá)式的值。例如:
x=10;
y=x>9?100:200;在上述第二個(gè)語(yǔ)句中,=的優(yōu)先級(jí)最低,所以y=后面的內(nèi)容是條件表達(dá)式,表達(dá)式1是x>9,因?yàn)閤為10,所以條件成立為真,因此取表達(dá)式2的值100作為條件表達(dá)式的值,并賦給y。若x=8,則y的值將是200。當(dāng)“?”與表達(dá)式2,3中的運(yùn)算符優(yōu)先級(jí)有矛盾時(shí),可加括號(hào),但“?”的優(yōu)先級(jí)已是13級(jí),只有逗號(hào)運(yùn)算符和賦值運(yùn)算符在它后面,因此一般情況是無(wú)括號(hào)的。注意“:”的用法和它的位置,“:”的位置是在表達(dá)式2與表達(dá)式3之間的。
2.逗號(hào)運(yùn)算符逗號(hào)運(yùn)算符“,”也稱(chēng)順序求值運(yùn)算符,其運(yùn)算優(yōu)先級(jí)為15,也是最低的,結(jié)合方向是自左至右。逗號(hào)運(yùn)算符的左邊總是不返回的,也就是說(shuō)逗號(hào)右邊表達(dá)式的值才是整個(gè)表達(dá)式的值。例如:
x=(y=3,y+1)該表達(dá)式括號(hào)內(nèi)是逗號(hào)表達(dá)式,由于結(jié)合方向是自左至右,先將3賦給y,然后計(jì)算表達(dá)式y(tǒng)+1,其值為4,逗號(hào)左邊的值不返回,逗號(hào)右邊的值才是整個(gè)表達(dá)式的值,所以表達(dá)式的值為4,最后將4賦給x。由于逗號(hào)運(yùn)算符的級(jí)別最低,因此以整體先求值時(shí)一般均需加圓括號(hào)。2.5.5其它運(yùn)算符除了前面介紹的運(yùn)算符外,表2.7列出了沒(méi)有介紹的其它運(yùn)算符,這些運(yùn)算符我們將在后續(xù)章節(jié)中介紹。表2.7其它運(yùn)算符2.5.6運(yùn)算符的優(yōu)先級(jí)和結(jié)合方向表2.8列出了所有C語(yǔ)言運(yùn)算符的優(yōu)先級(jí)和結(jié)合方向。注意所有的單目運(yùn)算符(第2級(jí))、賦值運(yùn)算符(第14級(jí))和條件運(yùn)算符(第13級(jí))都是從右至左結(jié)合的,要予以特別關(guān)注,其余均為從左至右結(jié)合的,與習(xí)慣一致。表2.8C語(yǔ)言運(yùn)算符的優(yōu)先級(jí)和結(jié)合方向注:運(yùn)算形式一欄中各字母的含義如下:a—數(shù)組,e—表達(dá)式,p—指針,t—類(lèi)型,x,y—變量。2.6表達(dá)式運(yùn)算符、常量以及變量構(gòu)成了表達(dá)式。在C語(yǔ)言中,表達(dá)式是這些成分的有效組合。因?yàn)榇蟛糠直磉_(dá)式的寫(xiě)法都是遵循代數(shù)符號(hào)規(guī)則,所以它們常常被看成理所當(dāng)然的。然而,C語(yǔ)言中的表達(dá)式仍有些要注意之處。2.6.1C語(yǔ)言的各種表達(dá)式
C語(yǔ)言的表達(dá)式非常豐富,也有人稱(chēng)C語(yǔ)言為表達(dá)式語(yǔ)言。如有算術(shù)表達(dá)式、關(guān)系表達(dá)式、邏輯表達(dá)式、條件表達(dá)式、逗號(hào)表達(dá)式、賦值表達(dá)式等等。
1.算術(shù)表達(dá)式算術(shù)表達(dá)式的形式如下:
<操作數(shù)><算術(shù)運(yùn)算符><操作數(shù)>算術(shù)表達(dá)式中運(yùn)算對(duì)象(操作數(shù))是數(shù)值,也可以是字符(按其ASCII碼值進(jìn)行運(yùn)算),運(yùn)算結(jié)果(即表達(dá)式的值)是數(shù)值。如:
a+b*2-d/3
2.關(guān)系表達(dá)式關(guān)系表達(dá)式的形式如下:
<操作數(shù)><關(guān)系運(yùn)算符><操作數(shù)>關(guān)系表達(dá)式中運(yùn)算對(duì)象是數(shù)值,也可以是字符(取其ASCII碼值),其運(yùn)算結(jié)果是邏輯量,即為“真”時(shí)取1,為“假”時(shí)取0。如3>2,結(jié)果為1。
3.邏輯表達(dá)式邏輯表達(dá)式的形式如下:
<操作數(shù)><邏輯運(yùn)算符><操作數(shù)>邏輯表達(dá)式的運(yùn)算對(duì)象是邏輯量。在C語(yǔ)言中無(wú)邏輯量,因此規(guī)定將非零的值按“真”對(duì)待,零值按“假”對(duì)待。而運(yùn)算結(jié)果為“真”時(shí)取1,為“假”時(shí)取0。
4.條件表達(dá)式條件表達(dá)式的形式如下:
<表達(dá)式1>?<表達(dá)式2>:<表達(dá)式3>其中表達(dá)式1的值按邏輯值對(duì)待,非零為“真”,零值為“假”。而當(dāng)表達(dá)式1值為“真”(非零)時(shí),條件表達(dá)式的值為表達(dá)式2的值;而當(dāng)表達(dá)式1的值為“假”(零)時(shí),條件表達(dá)式的值為表達(dá)式3的值。如y=x?a:b,若x=3,則y=a,若x=0,則y=b。表達(dá)式2或表達(dá)式3還可以是另一個(gè)條件表達(dá)式,應(yīng)注意它們是自右至左的結(jié)合方向。如a>b?a:c>d?c:d相當(dāng)于a>b?a:(c>d?c:d),當(dāng)a=1,b=2,c=3,d=4時(shí),此條件表達(dá)式的值等于4。當(dāng)表達(dá)式2和表達(dá)式3的類(lèi)型不一致時(shí),最后條件表達(dá)式的值的類(lèi)型取兩者的高者??蓞⒖?.6.2節(jié)。
5.逗號(hào)表達(dá)式逗號(hào)表達(dá)式的形式如下:表達(dá)式1,表達(dá)式2,…,表達(dá)式n逗號(hào)表達(dá)式按逗號(hào)間的順序依次從左至右執(zhí)行,但整個(gè)逗號(hào)表達(dá)式的值為最后一個(gè)逗號(hào)右邊表達(dá)式的值。
6.賦值表達(dá)式賦值表達(dá)式是最常用的表達(dá)式,形式如下:
<變量><賦值運(yùn)算符><表達(dá)式>賦值運(yùn)算符即=,又稱(chēng)為賦值號(hào)。賦值號(hào)左邊必須是變量、數(shù)組元素等有存儲(chǔ)單元的元素,賦值號(hào)的右邊可以是各類(lèi)表達(dá)式,也可以是另一個(gè)賦值表達(dá)式。因此a=b=c是合法的,即相當(dāng)于a=(b=c),因?yàn)樗亲杂抑磷蠼Y(jié)合的,即c值先賦給b,b=c賦值表達(dá)式的值為b的值,然后再賦給a,整個(gè)表達(dá)式的值也為a的值。賦值表達(dá)式的求值順序是先計(jì)算賦值號(hào)右邊表達(dá)式的值,再轉(zhuǎn)換成表達(dá)式左邊變量的類(lèi)型,再進(jìn)行賦值,此值也是賦值表達(dá)式的值。其類(lèi)型轉(zhuǎn)換的方法見(jiàn)下節(jié)。
10種復(fù)合賦值運(yùn)算符也可構(gòu)成賦值表達(dá)式。如a+=b相當(dāng)于a=a+b。2.6.2表達(dá)式中的類(lèi)型轉(zhuǎn)換當(dāng)不同類(lèi)型的常量和變量在表達(dá)式中混合使用時(shí),它們最終將被轉(zhuǎn)換為同一類(lèi)型。C語(yǔ)言在類(lèi)型轉(zhuǎn)換時(shí)是“向上”靠的。C語(yǔ)言規(guī)定,不同類(lèi)型的數(shù)據(jù)在參加運(yùn)算之前會(huì)自動(dòng)轉(zhuǎn)換成相同的類(lèi)型(兩個(gè)操作數(shù)之間運(yùn)算),然后再進(jìn)行運(yùn)算。運(yùn)算結(jié)果的類(lèi)型也就是轉(zhuǎn)換后的類(lèi)型。轉(zhuǎn)換的規(guī)則為:
(1)轉(zhuǎn)換的結(jié)果必定是3種基本類(lèi)型:int,long或double型。因此兩個(gè)char型的數(shù)據(jù)運(yùn)算,也要先轉(zhuǎn)換成int型,運(yùn)算結(jié)果也是int型;只要有一個(gè)數(shù)據(jù)是float型,都要先轉(zhuǎn)換成double型,最后結(jié)果也是double型。
(2)各類(lèi)型級(jí)別由低到高的順序?yàn)閏har,int,unsigned,long,unsignedlong,float,double。除如(1)所述要進(jìn)行char或short向int,float向double的轉(zhuǎn)換外,其余類(lèi)型的混合運(yùn)算均按此順序由低到高自動(dòng)轉(zhuǎn)換。另外,C語(yǔ)言規(guī)定,有符號(hào)類(lèi)型數(shù)據(jù)與無(wú)符號(hào)類(lèi)型數(shù)據(jù)進(jìn)行混合運(yùn)算,結(jié)果為無(wú)符號(hào)類(lèi)型。例如,int型數(shù)據(jù)和unsigned型數(shù)據(jù)的運(yùn)算結(jié)果為unsigned型。例2.4考慮圖2.2中的類(lèi)型轉(zhuǎn)換。圖2.2類(lèi)型轉(zhuǎn)換示例例2.5類(lèi)型轉(zhuǎn)換。
floatx;
inti;
x=i=3.14159;則變量i的值為3,而變量x的值為3.0而不是3,也不是3.14159。
(3)可以使用強(qiáng)制類(lèi)型轉(zhuǎn)換。通過(guò)使用強(qiáng)制類(lèi)型轉(zhuǎn)換(type),可以強(qiáng)迫表達(dá)式的值轉(zhuǎn)換為某一特定類(lèi)型。一般的形式是:
(類(lèi)型)表達(dá)式其中類(lèi)型(type)是C語(yǔ)言標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型。例如想確保表達(dá)式x/2成為float型,則可以寫(xiě)成如下形式:
(float)(x/2)當(dāng)然,如x為整型時(shí)則會(huì)丟失信息。如寫(xiě)成:
(float)x/2則表達(dá)式的結(jié)果為double型。強(qiáng)制類(lèi)型轉(zhuǎn)換通常被認(rèn)為是一個(gè)運(yùn)算符。作為一個(gè)運(yùn)算符,它是單目的,運(yùn)算優(yōu)先級(jí)為2級(jí),它的結(jié)合方向是自右向左。強(qiáng)制類(lèi)型轉(zhuǎn)換中類(lèi)型要用括號(hào)括起來(lái)。后面如果是表達(dá)式也應(yīng)括起來(lái)。強(qiáng)制類(lèi)型轉(zhuǎn)換用途之一是兩個(gè)整型量運(yùn)算而結(jié)果需保留小數(shù)部分時(shí),可對(duì)其中一個(gè)強(qiáng)制為float或double型,在運(yùn)算前系統(tǒng)會(huì)自動(dòng)將兩個(gè)操作數(shù)轉(zhuǎn)換為double型,運(yùn)算結(jié)果也是double型。
例2.6
整型數(shù)據(jù)相除。程序:
#include<stdio.h>
voidmain()
{
inti=100,j=40;
floatf;
f=i/j;
printf("f=%f\n",f);
}運(yùn)算結(jié)果:
f=2.000000上述程序中f的結(jié)果為2.0,小數(shù)部分丟失。如需保留小數(shù)部分,可將“f=i/j”;改寫(xiě)成:
f=(float)i/j;此時(shí)相當(dāng)于f=100.0/40,最后f的結(jié)果為2.5。強(qiáng)制類(lèi)型轉(zhuǎn)換得到的結(jié)果是一個(gè)瞬間量,它也不改變表達(dá)式中的原有數(shù)據(jù)。如例2.6中,(float)i為100.0,只在此時(shí)為實(shí)數(shù),此外i仍是整數(shù)100。強(qiáng)制類(lèi)型還用于參數(shù)類(lèi)型的轉(zhuǎn)換,如sqrt((double)i),因?yàn)閟qrt要求參數(shù)是雙精度型的,以保證函數(shù)參數(shù)類(lèi)型的一致。關(guān)于轉(zhuǎn)換結(jié)果可能丟失的信息如表2.9所示。表2.9普通類(lèi)型轉(zhuǎn)換的結(jié)果對(duì)于賦值運(yùn)算來(lái)說(shuō),賦值運(yùn)算結(jié)果按賦值號(hào)左邊的變量類(lèi)型進(jìn)行轉(zhuǎn)換,此時(shí)可能遇到表2.9中沒(méi)有列出的類(lèi)型轉(zhuǎn)換,可以將一種轉(zhuǎn)換分多次完成。例如,若要將double型轉(zhuǎn)換為int型,可先轉(zhuǎn)換為float型,然后再轉(zhuǎn)換為int型,這時(shí)數(shù)據(jù)的損失會(huì)更大,使用時(shí)要小心。2.6.3空格和圓括號(hào)為了增加程序的可讀性,在C程序的表達(dá)式中可以隨意增加空格。如以下兩個(gè)表達(dá)式是等價(jià)的:
x=10/y-(127/x)
x=10/y-(127/x)為了改變程序中表達(dá)式的求值順序,可以加入圓括號(hào)。使用多余的圓括號(hào)并不會(huì)降低該表達(dá)式運(yùn)行的速度,也不會(huì)引起錯(cuò)誤。因此我們提倡使用圓括號(hào)來(lái)更清晰地表達(dá)運(yùn)算次序,增加程序的易讀性。如下列兩個(gè)表達(dá)式哪一個(gè)更容易讀懂呢?
x=y/2-34*temp&127
x=(y/2)-((34*temp)&127)表達(dá)式除了由圓括號(hào)來(lái)改變運(yùn)算的優(yōu)先順序外,應(yīng)按照運(yùn)算符的優(yōu)先順
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國(guó)大型振動(dòng)試驗(yàn)機(jī)行業(yè)市場(chǎng)分析報(bào)告
- 2024-2030年中國(guó)即時(shí)通訊(im)行業(yè)競(jìng)爭(zhēng)格局及投資創(chuàng)新模式分析報(bào)告
- 眉山職業(yè)技術(shù)學(xué)院《電子商務(wù)概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年度食品代加工與產(chǎn)品質(zhì)量追溯協(xié)議3篇
- 2024年標(biāo)準(zhǔn)化物業(yè)租賃協(xié)議模板匯編版B版
- 2024年物聯(lián)網(wǎng)農(nóng)業(yè)技術(shù)開(kāi)發(fā)與合作合同
- 2024年標(biāo)準(zhǔn)股權(quán)轉(zhuǎn)讓協(xié)議一
- 馬鞍山師范高等專(zhuān)科學(xué)校《現(xiàn)場(chǎng)節(jié)目主持實(shí)踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年城市綜合體土地房屋股權(quán)轉(zhuǎn)讓與建設(shè)合同范本3篇
- 2024年度特色民宿商品房承包銷(xiāo)售合同3篇
- YY/T 0471.4-2004接觸性創(chuàng)面敷料試驗(yàn)方法 第4部分:舒適性
- YY/T 0251-1997微量青霉素試驗(yàn)方法
- YC/T 559-2018煙草特征性成分生物堿的測(cè)定氣相色譜-質(zhì)譜聯(lián)用法和氣相色譜-串聯(lián)質(zhì)譜法
- GB/T 29309-2012電工電子產(chǎn)品加速應(yīng)力試驗(yàn)規(guī)程高加速壽命試驗(yàn)導(dǎo)則
- 齊魯工業(yè)大學(xué)信息管理學(xué)成考復(fù)習(xí)資料
- 公務(wù)員面試-自我認(rèn)知與職位匹配課件
- 中頻電治療儀操作培訓(xùn)課件
- 柔弱的人課文課件
- 動(dòng)物寄生蟲(chóng)病學(xué)課件
- 電梯曳引系統(tǒng)設(shè)計(jì)-畢業(yè)設(shè)計(jì)
- 三度房室傳導(dǎo)阻滯護(hù)理查房課件
評(píng)論
0/150
提交評(píng)論