第2章 數(shù)據(jù)類型和表達(dá)式_第1頁
第2章 數(shù)據(jù)類型和表達(dá)式_第2頁
第2章 數(shù)據(jù)類型和表達(dá)式_第3頁
第2章 數(shù)據(jù)類型和表達(dá)式_第4頁
第2章 數(shù)據(jù)類型和表達(dá)式_第5頁
已閱讀5頁,還剩107頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第2章數(shù)據(jù)類型和表達(dá)式2.1標(biāo)識符、常量和變量2.2基本數(shù)據(jù)類型2.3運算符和表達(dá)式習(xí)題22.1標(biāo)識符、常量和變量 2.1.1標(biāo)識符 1.標(biāo)識符的定義 編寫程序,需要使用相應(yīng)的計算機語言,而語言主要是由它所限定的符號表示一些字、詞、命令、變量及數(shù)據(jù)等。這些符號組成了語言,標(biāo)識符指的就是用來標(biāo)識變量名、符號常量名、函數(shù)名、文件名以及一些具有專門含義的有效字符序列。通俗地說,標(biāo)識符就是一個名字。 2.標(biāo)識符的規(guī)定 在C語言中使用標(biāo)識符有如下規(guī)定。 (1)合法的標(biāo)識符只能由字母、數(shù)字和下劃線組成,并且第一個字符必須為字母或下劃線。 (2)大寫字母和小寫字母被視為兩個不同的字符。如sum、SUM被認(rèn)為是兩個不同的標(biāo)識符。 (3)標(biāo)識符的長度(即一個標(biāo)識符允許的字符個數(shù))一般規(guī)定取前8個字符為有效字符,多余的將不被識別。如student_name、student_num被認(rèn)為是相同的標(biāo)識符student_。 例如:sum、area、aver.PI、_above、L_1_2_3、S12是合法的標(biāo)識符;而A.B.C、A.123、13、3area、a+b是不合法的標(biāo)識符。 3.標(biāo)識符的分類 在C語言中,標(biāo)識符分為3類,即關(guān)鍵字標(biāo)識符、預(yù)定義標(biāo)識符和用戶自定義標(biāo)識符。 1)關(guān)鍵字標(biāo)識符 關(guān)鍵字又稱為命令符,在程序中具有特定的含義,不能另作它用,其他字符又無法直接替代。例如,程序中用來說明變量類型的標(biāo)識符int、char及選擇結(jié)構(gòu)中的if、else等,都是關(guān)鍵字標(biāo)識符。

C語言中的關(guān)鍵字標(biāo)識符包括: auto break case char const continue default do doubleelse enum extern float for goto if int longregister return short signed sizeof static struct switch typedefunion unsignedvoid volatile while 2)預(yù)定義標(biāo)識符 在C語言中,預(yù)定義標(biāo)識符一般是指C語言提供的庫函數(shù)名和預(yù)編譯處理命令(如printf、scanf、define)等。C語言允許這類標(biāo)識符(函數(shù)名)另作它用,但這將使這些標(biāo)識符失去系統(tǒng)規(guī)定的原意。為了編程時方便、可靠、避免誤解,一般把這些標(biāo)識符固定使用。 3)用戶自定義標(biāo)識符 用戶在進(jìn)行編程時,需要自己對變量、函數(shù)、數(shù)組、文件和常量等進(jìn)行命名,命名規(guī)則前面已有說明,這類由用戶根據(jù)需要自己定義的標(biāo)識符稱為用戶自定義標(biāo)識符。在使用用戶自定義標(biāo)識符時應(yīng)注意以下3點: (1)最好根據(jù)其含義選用英文縮寫及漢語拼音作標(biāo)識符,這樣便于閱讀程序。 (2)決不能與關(guān)鍵字相同,否則編譯時給出錯誤信息。 (3)如果與預(yù)定義標(biāo)識符相同,系統(tǒng)并不報錯,則程序仍能運行,只是預(yù)定義標(biāo)識符失去原來的含義,代之以用戶確認(rèn)的含義,這樣會造成編程混亂現(xiàn)象,應(yīng)避免發(fā)生。 2)符號常量 使用常量可以提高程序運行速度,提高程序執(zhí)行的效率,而使用標(biāo)識符常量則可提高程序的易讀性、可修改性,便于調(diào)試程序,減少出錯機會。 如果在程序中多次出現(xiàn)一些很大的數(shù)字或很長的字符串,為了改進(jìn)代碼的可讀性和可維護(hù)性,則可以給某一特定的值賦予一個名字,以后用到這個值時就用名字代表,這樣便于程序修改和閱讀,這個名字就是符號常量。符號常量有點像變量,但不能像對變量那樣修改符號常量,也不能對符號常量賦以新值。 下面看一個符號常量的例子。 【例2-1】定義一個符號常量PI,表示圓周率,然后使用符號常量PI計算圓的面積。 #include"stdio.h" #definePI3.1415926 /*定義符號常量PI,其值為3.1415926*/ main() { floatradius; /*radius圓的半徑*/ floatarea; /*area圓的面積*/

printf("Pleaseinputradius:"); scanf("%f",&radius);/*輸入圓的半徑*/ area=PI*radius*radius;/*計算圓的面積*/ printf("area=%f",area);} 從該例中可以看出,程序用#define命令行定義PI代表常量3.1415926,程序在編譯時將用3.1415926替代PI,有關(guān)#define命令的用法將在后面的章節(jié)中進(jìn)行詳細(xì)介紹。

使用符號常量時,應(yīng)注意以下幾項: (1)符號常量不同于變量,它的值在其作用域(本例中為主函數(shù))內(nèi)不能改變,也不能再被賦值,例如在程序中出現(xiàn)下面的語句就是錯誤的。 PI=3.14; (2)習(xí)慣上,符號常量名用大寫,變量名用小寫。 (3)使用符號常量的好處有兩個。一是含義清楚,如在本例中,可以看出PI代表圓周率。二是在需要修改常量值時比較方便,例如可以用#definePI3.14替代原有命令行以達(dá)到修改圓周率的目的。 2.變量 1)變量的定義 程序運行過程中,其值可以改變的量叫變量。程序中使用的變量,屬于用戶自定義標(biāo)識符,任何一個變量名必須先定義(即確定變量名和變量的類型)后使用。 一個變量實質(zhì)上是指計算機內(nèi)存中某個存儲一定類型數(shù)據(jù)的單元,變量名實質(zhì)上是這個數(shù)據(jù)存儲單元的符號表示。對變量進(jìn)行的操作就是對該存儲單元進(jìn)行操作,對變量賦值就是將數(shù)據(jù)存入該變量所代表的內(nèi)存單元中。程序中的變量與數(shù)學(xué)上的變量概念不同:變量中的“變”體現(xiàn)的是這個存儲單元可以存放不同的數(shù)據(jù),但每一時刻只具有惟一的值,即新放入的數(shù)據(jù)將覆蓋原有的數(shù)據(jù)。 變量也有類型之分,常用的有整型變量、實型變量和字符型變量等。變量因類型不同在內(nèi)存中所占的存儲空間也不同,系統(tǒng)在編譯時能根據(jù)所定義的變量類型為其分配相應(yīng)數(shù)量的存儲單元。 2)定義變量的一般形式 定義變量的一般形式為 數(shù)據(jù)類型變量名1,變量名2,變量名3,…;

【例2-2】用price代表商品單價,num代表商品數(shù)量,然后計算商品的總價total。注意程序中只是定義了變量total,而沒有定義變量price和num。 #include"stdio.h" main() { inttotal; num=5; /*此處變量num沒有先定義而使用,編譯時會出錯*/ price=3;/*此處變量price沒有先定義而使用, 編譯時會出錯*/ total=price*num; printf("total=%d",total); } 從例2-2可以看出,對變量使用前必須先定義,這樣可以保證變量在使用中的正確性。 說明: 變量的數(shù)據(jù)類型決定了變量的取值范圍和占用內(nèi)存空間的字節(jié)數(shù),變量名表示具有同一數(shù)據(jù)類型變量的集合。C語言這樣要求的目的有以下3點。 (1)凡是未被事先定義的,不能作為變量名,這樣做能保證程序中變量名的正確使用。例如,在定義部分寫成intst; 而在語句中錯寫成stu,在編譯時會檢查出stu未被定義,不能作為變量名,這樣便于用戶發(fā)現(xiàn)錯誤,避免變量名在使用時出錯。 (2)每個變量被定義為一個確定數(shù)據(jù)類型,在編譯時能為其分配相應(yīng)的存儲空間。例如定義x為int型,則編譯程序?qū)樽兞縳分配兩個字節(jié)的存儲空間,并按照整型方式存儲。 (3)每個變量屬于一定的數(shù)據(jù)類型,便于編譯時據(jù)此檢查該變量所進(jìn)行運算的合法性。例如,整型變量x和y可以進(jìn)行求模運算:x%y,%是求模運算符,得到x除以y的整余數(shù)。如果將x和y定義為浮點型變量,則不允許進(jìn)行“求?!边\算,在編譯階段就會指出有關(guān)的出錯信息。2.2基本數(shù)據(jù)類型 在設(shè)計一個程序時,首先要確定采用什么類型的數(shù)據(jù),對不同的問題,采用的數(shù)據(jù)類型應(yīng)不同。例如,在統(tǒng)計全校有多少學(xué)生時就應(yīng)該用整型數(shù)據(jù),而不應(yīng)使用帶小數(shù)的數(shù)據(jù)或其他數(shù)據(jù)。數(shù)據(jù)是程序的必要組成部分,是程序處理的對象。由于數(shù)據(jù)類型體現(xiàn)了數(shù)據(jù)結(jié)構(gòu)的特點,高級語言所提供的數(shù)據(jù)類型越豐富,由其數(shù)據(jù)類型所表現(xiàn)的數(shù)據(jù)結(jié)構(gòu)就越豐富、復(fù)雜,因而,這種高級語言的功能和所處理問題的能力就越強。

C語言規(guī)定,程序中所用到的任何一個變量和數(shù)據(jù)都必須指定其數(shù)據(jù)類型。 C語言中的數(shù)據(jù)類型如圖2.1所示。圖中括號內(nèi)所注是程序中使用的類型名。圖2.1C語言中的數(shù)據(jù)類型 2.2.1整型數(shù)據(jù) 1.整型常量 整型常量,即整型常數(shù)。C語言整型常量可用以下3種形式表示。 1)十進(jìn)制整型常數(shù) 十進(jìn)制整型常數(shù),如+156,-253,121,0等。 2)八進(jìn)制整數(shù) 八進(jìn)制整數(shù)是以0開頭(注:不是英文字母O而是數(shù)字零)的數(shù),在數(shù)學(xué)領(lǐng)域內(nèi)0123和123表示兩個值相同的整數(shù),而在C語言中,0123表示八進(jìn)制的123,它的十進(jìn)制值應(yīng)是 1×82+2×81+3×80=64+16+3=83 使用八進(jìn)制數(shù)時應(yīng)注意以下幾項: (1)在八進(jìn)制中不允許出現(xiàn)8和9; (2)在程序中出現(xiàn)的八進(jìn)制數(shù)一定要以0開頭,但當(dāng)程序的輸出結(jié)果為八進(jìn)制數(shù)時,前面的0消失。 3)十六進(jìn)制整數(shù) 十六進(jìn)制整數(shù)是以0x開頭的數(shù),如0x123。0x123的十進(jìn)制數(shù)為 0x123=1×162+2×161+3×160=256+32+3=291 使用十六進(jìn)制數(shù)時應(yīng)注意以下幾項: (1)大于9時可依次用a,b,c,d,e,f表示;

(2)在程序中出現(xiàn)的十六進(jìn)制數(shù)一定要以0x開頭,但當(dāng)程序輸出結(jié)果為十六進(jìn)制時,前面的0x消失。 十進(jìn)制與二進(jìn)制、八進(jìn)制、十六進(jìn)制的轉(zhuǎn)換見表2-1。表2-1數(shù)制轉(zhuǎn)換表表2-1數(shù)制轉(zhuǎn)換表 2.整型變量 1)整型變量的分類 整型變量可分為以下4種整型類型: (1)基本型,以int表示; (2)短整型,以short表示; (3)長整型,以long表示; (4)無符號整型,以unsigned表示。unsigned可以加在int、short和long的前面,分別表示無符號整型、無符號短整型和無符號長整型。 在IBM-PC機及兼容機中,以上整型類型的數(shù)據(jù)所占的字節(jié)數(shù)和所表示的范圍見表2-2。表2-2各種整型變量數(shù)據(jù)的存儲長度及表示范圍 2)整型變量的定義和使用 變量必須先定義,后使用。對于變量的定義,一般放在一個函數(shù)開頭的聲明部分。 整型變量定義的格式如下: 類型標(biāo)識符變量名1,變量名2,變量名3,…; 類型標(biāo)識符可以是int、short、long、unsigned,或是它們的組合,例如: intx,y; . /*指定變量x,y為整型變量*/ longc,d; /*指定變量c,d為長整型變量*/

unsignedage,weight; /*指定變量age,weight為無符號整型變量*/ inta=3,b=4; /*定義a,b為整型變量同時將3和4分別賦予a和b*/ 3.整型數(shù)據(jù)在內(nèi)存中的存放形式 任何數(shù)據(jù)在計算機內(nèi)部都以二進(jìn)制形式存放。一般情況下,8位二進(jìn)制數(shù)組合在一起稱為一個字節(jié)(byte),大量的字節(jié)按序組合在一起構(gòu)成存儲器。 在C語言中,一個整型數(shù)通常占用2個字節(jié),低位在前一個字節(jié),高位在后一個字節(jié)。 下面舉例說明。 1)整數(shù)9在存儲單元中的存儲形式 (1)整數(shù)9作為有符號正數(shù)時(即int型),最高位用0表示正數(shù),而不表示數(shù)值。 0 0000000 00001001 (2)整數(shù)9作為無符號數(shù)時(即unsigned型),所有二進(jìn)制位都有確定的值。 00000000 00001001 注意:無符號數(shù)最大值為65535,其存儲形式為 11111111 11111111 2)負(fù)整數(shù)在存儲單元中的存儲形式 負(fù)整數(shù)在存儲單元中是以補碼形式存放的。以-1為例,-1的補碼應(yīng)為其原碼除符號位不變外,其余各位求反后加1,即對1000000000000001求反再加1。故-1在存儲單元中的存放形式為 1 1111111 11111111 注意: (1)負(fù)整數(shù)在存儲單元中的存放形式與它的真值有極大差別。 (2)負(fù)整數(shù)不能用無符號數(shù)表示。 (3)存儲單元中,若最高位為0,即為正數(shù),該數(shù)可理解為無符號數(shù),也可理解為有符號數(shù),其值是相等的。 (4)內(nèi)存儲單元中,最高位為1時,若理解為有符號數(shù),則必為負(fù)數(shù),并且該負(fù)數(shù)是以補碼形式存放的。若理解為無符號數(shù),則最高位代表一定的數(shù)值,如16位二進(jìn)制數(shù)最高位為1時,代表216-1,即表示32768。 【例2-3】整型變量的定義與輸出。 #include"stdio.h" main() { inta; /*指定a為整型常數(shù)*/ unsignedb; /*指定b為無符號整型常數(shù)*/ a=-1; /*將a賦值為-1*/ b=a; printf("a=%d\n",a); /*輸出a的值*/ printf("b=%u\n",b); /*輸出無符號數(shù)b的值*/ } 運行結(jié)果: a=-1 b=65535 4.整型變量的賦值 可以將一個整型常量或整型變量賦值給整型變量,例如: intx=560; 但是要注意任何一個整型變量占用一定的存儲空間,因此其存儲的數(shù)據(jù)取值范圍也就是一定的,詳細(xì)情況見表2-2。如果將一個大于32767或小于-32768的數(shù)據(jù)賦值給一個int型變量就會產(chǎn)生溢出。 產(chǎn)生的結(jié)果和我們的想象不同,原因是32768被接收為1000000000000000,它是-32768的補碼;32769被接收為1000000000000001,它是-32767的補碼,如圖2.2所示。圖2.2整型數(shù)據(jù)在內(nèi)存中的溢出-32768-32767 整型數(shù)據(jù)的溢出在編譯時不會出錯,但在程序運行中會出現(xiàn)錯誤,因此應(yīng)該避免。 平時應(yīng)注意不同類型數(shù)據(jù)的取值范圍,如果整型變量不能處理問題,則可以考慮用長整型變量。 可以將一個整型常量后面加一個字母l或L,則認(rèn)為此常量為長整型常量,也可以將此長整型常量賦值給一個長整型變量。例如: longx=560L; 長整型常量往往用于函數(shù)調(diào)用中。如果函數(shù)的形參為longint型,則要求實參也要是長整型。 2.2.2實型數(shù)據(jù) 1.實型常量 在C語言中實型表示實數(shù)的集合,實型常量又稱實數(shù)。實型常量有兩種表現(xiàn)形式。 1)十進(jìn)制數(shù)形式 十進(jìn)制數(shù)形式和數(shù)學(xué)中的實數(shù)形式類同,由數(shù)字和小數(shù)點組成,小數(shù)點是實數(shù)的標(biāo)志。 例如:0.168,168,1680,3.168,168.3,0.0都是實數(shù)。

2)指數(shù)形式 實數(shù)的指數(shù)形式類似于數(shù)學(xué)中的指數(shù)形式。C語言中,它由數(shù)字、小數(shù)點和字母E或e組成,格式如下: 數(shù)字[小數(shù)]E[±]整數(shù) ([]內(nèi)為可省項) 實型常數(shù)的表示方法示例見表2-3。表2-3實型數(shù)據(jù)在C語言中的表示形式 在使用指數(shù)形式時應(yīng)注意以下幾項: (1)字母E(或e)前可以是小數(shù)或整數(shù),如果是純小數(shù),則可以將小數(shù)點之前的0省略,但是E(e)之前必須有數(shù)字。例如E2,e是不合法的指數(shù)形式。 (2)字母E(或e)后必須為整數(shù),不能出現(xiàn)小數(shù)的情況。例如1e2.5,1.2E8.9是不合法的指數(shù)形式。 (3)一個實數(shù)有多種指數(shù)表示形式,如果字母E(或e)前的小數(shù)或整數(shù)的范圍是1~10,則此時稱為“規(guī)范化的指數(shù)形式”。 2.實型變量 1)實型變量的分類 實型變量分為以下3種類型: (1)單精度型,以float表示。 (2)雙精度型,以double表示。 (3)長雙精度型,以longdouble表示。 2)實型數(shù)據(jù)在內(nèi)存中的存放形式 與整型數(shù)據(jù)的存儲形式不同,實型數(shù)據(jù)是以指數(shù)形式存放的。一般情況下,系統(tǒng)將一個實型數(shù)據(jù)分為小數(shù)部分和指數(shù)部分并分別存放。指數(shù)部分采用規(guī)范化的指數(shù)形式,具體存放結(jié)構(gòu)如圖2.3所示。圖2.3實型數(shù)據(jù)在內(nèi)存中的存放形式 數(shù)符占用一位,用來表示數(shù)據(jù)的符號。小數(shù)部分占用的位越多,數(shù)的有效數(shù)字就越多。指數(shù)部分占用的位越多,數(shù)值范圍也就越大。實型數(shù)據(jù)所占用的字節(jié)數(shù)、有效數(shù)字位數(shù)和數(shù)值的范圍見表2-4。表2-4實型數(shù)據(jù) 3)實型變量的定義 實型變量定義的格式如下: 類型標(biāo)識符變量名1,變量名2,變量名3,…; 類型標(biāo)識符可以是float、double、longdouble等,例如: floatx,y; /*指定變量x,y為單精度實型變量*/ doublelength,high; /*指定變量length,high為雙精度實型變量*/ longdoublec,d;/*指定變量c,d為長雙精度實型變量*/ 4)實型變量的賦值 可以將實型常量或?qū)嵭妥兞抠x值給實型變量。注意單精度實型數(shù)據(jù)的有效位數(shù)是6~7位,在進(jìn)行賦值和計算時會產(chǎn)生誤差,在雙精度實型數(shù)據(jù)和長雙精度實型數(shù)據(jù)中也同樣存在此問題。例2-5說明實型數(shù)據(jù)的確存在誤差。 【例2-5】將一個有效數(shù)字位超過7位的數(shù)賦值給實型變量,然后輸出實型變量的值,實型變量產(chǎn)生誤差。

#include"stdio.h" main() { floatx=123456789; doubley=123456789; printf("\nx=%f,y=%f",x,y); } 運行結(jié)果: x=123456792.000000,y=123456789.000000 從運行結(jié)果可以看出,單精度實型變量x只接收了前面7位,從第8位開始數(shù)據(jù)不準(zhǔn)確。所以在使用實型數(shù)據(jù)時一定注意可能產(chǎn)生的誤差。應(yīng)當(dāng)避免將一個很大的數(shù)和一個很小的數(shù)直接進(jìn)行運算,否則將“丟失”這個很小的數(shù)。 許多C編譯系統(tǒng)將實型常量作為雙精度來處理,這樣保證計算結(jié)果更精確,但是運算速度會降低。可以在數(shù)的后面加字母F或f(例如1.23f),這樣系統(tǒng)就會按單精度來進(jìn)行運算,可以提高運行速度,但是會降低運算的精度。 2.2.3字符型數(shù)據(jù) 1.字符型常量 字符型常量(簡稱字符常量)是一個字符,在表示時由兩個單引號括起來。 在C語言中每一個字符型常量均有其特定的值,也就是一個字符一個編碼,通常使用ASCII碼(美國標(biāo)準(zhǔn)信息交換碼)。例如'A','a','+','?','','1','2'等都是合法的字符常量。 字符型常量在內(nèi)存中占用一個字節(jié),其取值范圍為0~255,存放的是字符的ASCII碼值,如字符‘A’的值為65,‘B’的值為66,‘a(chǎn)’的值是97,‘0’的值是48,空格字符的值為32。所有字符常量還可作為整型量進(jìn)行運算,以及參與相應(yīng)的各種操作。 例如,'A'+1的值為66,或'A'+1的值為'B'。 2.轉(zhuǎn)義字符 C語言中有一種特殊的字符常量——轉(zhuǎn)義字符,這類字符常量是以反斜杠字符“\”開頭的字符序列,它表示某個特定的ASCII碼字符。在程序中,轉(zhuǎn)義字符要放在一對單引號內(nèi)。 轉(zhuǎn)義字符及其作用見表2-5。表2-5轉(zhuǎn)義字符及其作用【例2-6】使用轉(zhuǎn)義字符控制輸出實例。#include"stdio.h"main(){printf("\n\t\101"); /*光標(biāo)到下一行行首,再到下一個制表位,輸出A(ASCII編碼*//*為八進(jìn)制的101)*/printf("\n\t\b\b\b\b"); /*光標(biāo)到下一行的行首,再到下一個制表位,然后退四格*/ printf("\\*hello*\\"); /*輸出\*hello*\*/ printf("\n\t\x41"); /*光標(biāo)到下一行行首,再到下一個制表位,輸出A(ASCII編碼*/ /*為十六進(jìn)制的41)*/ } 運行結(jié)果: A \*hello*\ A 從上面的例子中可以看出,要想使輸出的結(jié)果美觀大方,可以使用轉(zhuǎn)義字符。例如,若希望輸出字符“\”,則使用“\\”;若希望輸出雙引號“"”,則使用“\"”等。 3.字符變量 字符型變量用來存放字符常量,要注意一個字符變量只能放一個字符,不要以為在一個字符變量中可以放一個字符串(包括若干個字符)。 1)字符變量的定義 字符變量的定義形式如下: char字符變量名1,字符變量名2,字符變量名3,…; 例如,下面定義了兩個字符變量c1,c2: charc1,c2;

2)字符數(shù)據(jù)在內(nèi)存中的存儲形式 將一個字符常量放在一個字符變量中,實際上并不是將字符的點陣信息或矢量信息放在內(nèi)存中,而是將該字符的ASCII碼信息放在相應(yīng)的內(nèi)存中。 例如字符“a”的ASCII碼為97,字符“b”的ASCII碼為98,如果將其分別放在字符變量c1和c2中,十進(jìn)制存儲形式如圖2.4(a)所示,實際上是以二進(jìn)制的形式存儲的,如圖2.4(b)所示。 3)字符變量的賦值 可以將一個字符常量或字符變量賦值給一個字符變量,也可以將0~255的整型數(shù)據(jù)賦值給一個字符變量,并且字符變量、字符常量、0~255的整型數(shù)據(jù)之間可以進(jìn)行運算。圖2.4字符數(shù)據(jù)在內(nèi)存中的存儲(a)十進(jìn)制存儲形式;(b)二進(jìn)制存儲形式 【例2-7】分別將字符常量和整型常量賦給字符型變量,然后輸出字符或者輸出字符的ASCII碼。 #include"stdio.h" main() { charc1,c2; c1='A'; /*將65賦給c1*/ c2=66; /*將66賦給c2*/ printf("\nc1=%c,c2=%c",c1,c2); /*輸出c1,c2存放的字符*/

printf("\nvalueofc1andc2:%d%d",c1,c2); /*輸出c1,c2中存放的數(shù)據(jù)*/ printf("\nnextcharacterofc1:%c",c1+1); /*輸出字符A下面的字符*/ } 從該例中可以看出,C語言對字符的這種處理方法為程序設(shè)計增大了自由度。如可以對文字進(jìn)行加密,即可以對字符作各種轉(zhuǎn)換。大寫字母A和B的ASCII碼為65和66,小寫字母a和b的ASCII碼為97和98,可以看出小寫字母的ASCII碼比其大寫字母大32,即'A'+32就得到'a',計算非常方便。 【例2-8】將大寫字母轉(zhuǎn)換為小寫字母,將小寫字母轉(zhuǎn)換為大寫字母。 #include"stdio.h" main() { charc1,c2; c1='A'; c2='b'; c1=c1+32; /*將大寫字母加32得到小寫字母*/

c2=c2-32; /*將小寫字母減32得到大寫字母*/ printf("c1=%c,c2=%c",c1,c2); } 運行結(jié)果: c1=a,c2=B 4.字符串常量 1)字符串常量的定義 字符串常量是指用一對雙引號括起來的字符序列。如"howareyou!","$123","CHINA","a"都是字符串常量。 注意:C語言中沒有字符串變量,字符串存放在字符數(shù)組中,例如charc[5]={"CHINA"},詳細(xì)情況參見后面章節(jié)。 2)字符串常量在內(nèi)存中的存儲形式 字符串常量在內(nèi)存中存儲時一個字符占用一個字節(jié),并且在字符串的末尾有一個結(jié)束符,C語言規(guī)定結(jié)束符為字符'\0',字符'\0'是指ASCII碼為0的字符。字符串必須有一個結(jié)束符。如果沒有結(jié)束符,則程序在輸出時不知到何處停止。例如,字符串"CHINA"在內(nèi)存中的存儲情況如圖2.5所示。圖2.5字符串在內(nèi)存中的存儲 2.2.4變量賦初值 變量賦初值是指在定義變量的同時對變量進(jìn)行賦值。例如: inta=5; floatp=3.14; charc1='a'; 可以對被定義的變量的一部分賦初值。例如: inta,b,c=10; 如果對幾個變量賦予同一個值,則可以寫成 inta=b=c=d=10;

變量的初始化不是在編譯階段完成的,而是在程序運行時進(jìn)行賦值的,所以初始化語句為 inta=10; 相當(dāng)于 inta; a=10;2.3運算符和表達(dá)式 2.3.1算術(shù)運算符和算術(shù)表達(dá)式 1.基本的算術(shù)運算符 基本的算術(shù)運算符有5個:+、﹣、*、/、%,其特性見表2-6。表2-6基本運算符列表 這5種運算符均可以作為雙目運算符,即在運算符的兩邊有數(shù)據(jù)。+和-運算符可以為單目運算符,即運算符的右邊有數(shù)據(jù),例如+3,-5等。兩個整數(shù)相除的結(jié)果為一個整數(shù),但是,如果除數(shù)或被除數(shù)中出現(xiàn)一個負(fù)數(shù),則結(jié)果是不固定的。例如:-5/3有的機器的結(jié)果為-1,有的機器的結(jié)果為-2,如遇到此類問題應(yīng)該編寫程序測試結(jié)果。 注意,求余運算符%兩側(cè)的數(shù)據(jù)要求必須為整數(shù),運算的結(jié)果為整數(shù)相除的余數(shù)。 2.算術(shù)表達(dá)式 由算術(shù)運算符將操作數(shù)連接起來的有意義的式子稱為算術(shù)表達(dá)式。例如2+a*b,-3*a%b,a*(b+3)等,其中,“()”也是運算符,在所有運算符中級別最高。 3.算術(shù)運算符的優(yōu)先級與結(jié)合性 運算符*、/、%的優(yōu)先級為3級,高于+、-的4級。這5種運算符的結(jié)合性是“自左至右”的。 2.3.2自增、自減運算符及其表達(dá)式 自增(自減)運算符有兩類,分別為前置和后置運算符。 1.格式與功能 1)前置運算符的格式和功能 前置自增、自減運算符的格式為 ++i--i 功能:變量i先增加(減少)1,即i=i±1,然后再使用i的值。

2)后置運算符的格式和功能 后置自增、自減運算符的格式為

i++i-- 功能:先使用i的值,然后變量i的值增加(減少)1,即i=i±1。 例如: inta=3,b; b=a++; 執(zhí)行后,b的值為3,a的值為4。 又如: inta=3,b; b=++a; 執(zhí)行后,b的值為4,a的值為4。 2.自增、自減運算符的運算 自增、自減運算為單目運算,其運算數(shù)據(jù)為單操作數(shù),且操作數(shù)只能是變量,不能是常量或表達(dá)式。如7++、(x+y)--均是錯誤的表示方法。 3.自增、自減運算符的結(jié)合性 自增、自減運算符屬右結(jié)合性。 例如,若有“inti=3;”則對于表達(dá)式-i++是理解為(-i)++呢,還是理解為-(i++)?因自增運算符只適用于變量,而-i不是變量,是表達(dá)式,顯然(-i)++從語法上說是錯誤的。而-i++的“-”號與“++”號同級,也就是說,變量i兩邊出現(xiàn)兩個級別相同的運算符,由于這種運算符屬右結(jié)合性,因此i應(yīng)先與右邊的“++”號結(jié)合,即-i++等價于-(i++)。 又如:設(shè)有語句“inti=3,a;”,則表達(dá)式a=-(i++)等價于{a=-i;i=i+1;}。 由于“++”在i之后,故先使用i,然后使I的值增加1。執(zhí)行該表達(dá)式后,a的值為-3,i的值為4。 在使用自增、自減運算符時應(yīng)注意以下幾項: (1)使用++i或i++單獨構(gòu)成語句時,其作用是等價的,均為i=i+1。 (2)運算對象只能是整型變量和實型變量。 (3)對于表達(dá)式(i++)+(i++)+(i++),不同的編程環(huán)境,其結(jié)果不同。若設(shè)“i=3;”,本書使用TurboC系統(tǒng),表達(dá)式的值是9,i的值自增3次,結(jié)果為6。 【例2-9】自增、自減運算符的運算。 #include"stdio.h" main() { inti,j; i=3; j=i++; /*i賦給j,j=3,i自增1,i=4*/ printf("\nj=%d,i=%d",j,i); i=3; j=++i; /*i自增1,i=4,i賦給j,j=4*/ printf("\nj=%d,i=%d",j,i); i=3; printf("\ni=%d",i++); /*i=3輸出i的值,然后i自增1,i=4*/ printf("\ni=%d",++i); /*i=4,i自增1,i=5,輸出i的值*/ i=3; printf("\n%d,%d",i++,i++); /*運算由右至左,輸出結(jié)果為4,3,之后i=5*/

printf("\n%d,%d",++i,++i); /*開始i=5,運算由右至左,輸出結(jié)果為7,6,最后i=7*/ i=3; j=(i++)+(i++)+(i++); /*i=3,i先參與運算,j=3+3+3,之后i進(jìn)行3次*/ /*自增1的運算,i=6*/ printf("\nj=%d",j); i=3; j=(++i)+(++i)+(++i); /*i=3,i先進(jìn)行三次自增1的運算,i=6,j=6+6+6*/ printf("\nj=%d",j); } 運行結(jié)果:j=3,i=4j=4,i=4i=3i=54,37,6j=9j=18 2.3.3逗號運算符及其表達(dá)式 C語言提供一種特殊的運算符——逗號運算符,即“,”。逗號運算符的優(yōu)先級別最低,結(jié)合性是自左至右。逗號表達(dá)式是指用逗號運算符將兩個表達(dá)式結(jié)合起來的表達(dá)式。 1.逗號表達(dá)式的格式和功能 逗號表達(dá)式的格式為 表達(dá)式1,表達(dá)式2,表達(dá)式3,…,表達(dá)式n 功能:先計算表達(dá)式1,再計算表達(dá)式2,最后計算表達(dá)式n。最后一個表達(dá)式的值即為此逗號表達(dá)式的值。 2.逗號運算符的優(yōu)先級 在所有運算符中,逗號運算符級別是最低的。例如,對于表達(dá)式b=a=3,6*b,其作用是將3賦給變量a和b,而逗號表達(dá)式的值為18。 利用逗號表達(dá)式可實現(xiàn)在一條C語言中對多個變量賦予不同值的功能。因此,在有些情況下,我們并不關(guān)心逗號表達(dá)式的值,而是關(guān)心逗號表達(dá)式中各個表達(dá)式的功能。 例如,表達(dá)式“a=3,b=4,c=5”的功能是將3,4和5分別賦給變量a,b和c;而表達(dá)式“a=7+b+c,a++”的功能是將7+b+c的值賦給變量a后,變量a自增加1。 注意,并不是任何地方出現(xiàn)的逗號都作為逗號運算符。例如,函數(shù)參數(shù)也是用逗號隔開的,如: printf("%d,%d,%d",a,b,c); 上一行“a,b,c”中的逗號不是逗號運算符,它只是起到了隔開參數(shù)的目的。 2.3.4賦值運算符及其表達(dá)式 1.賦值運算符 賦值運算符,即“=”,它的作用是將一個數(shù)據(jù)賦給一個變量。數(shù)據(jù)可以是常量、變量、表達(dá)式等。如“a=3”的作用是將常量3賦給變量a。 賦值運算符“=”不同于數(shù)學(xué)中的等號。因為x=x+1在數(shù)學(xué)中是絕對不成立的,而在C語言中是將x的值加1再賦給x變量。 2.復(fù)合的賦值運算符 在賦值運算符的前面加上其他運算符,可以構(gòu)成復(fù)合的賦值運算符。凡是二目運算符都可以與賦值運算符一起構(gòu)成復(fù)合賦值運算符。C語言規(guī)定有10種復(fù)合賦值運算符: +=,﹣=,*=,/=,%=,<<=,>>=,&=,^=,|= 復(fù)合賦值運算符級別相同,且與賦值運算符同一優(yōu)先級,都具有右結(jié)合性,即結(jié)合方向是“自右至左”。 復(fù)合賦值運算符的運算比較特殊,例如: a+=3 等價于a=a+3 b-=8+3 等價于b=b-(8+3) x*=x+3 等價于x=x*(x+3) y%=3 等價于y=y%3 C語言中采用復(fù)合賦值運算符的目的,一是為了簡化程序,二是為了提高編譯效率。 3.賦值表達(dá)式 用賦值運算符或復(fù)合賦值運算符將一個變量和一個表達(dá)式連接起來的式子稱為賦值表達(dá)式,它的一般形式為變量賦值運算符表達(dá)式

每一個表達(dá)式都有一個值,賦值表達(dá)式的值就是前面變量的值。例如“x=10”是一個賦值表達(dá)式,表達(dá)式的作用是將10賦給變量x,此表達(dá)式的值為10?!癮=b=10”也是一個賦值表達(dá)式,因為賦值運算符的結(jié)合性是“自右至左”,所以表達(dá)式先進(jìn)行b=10的運算,然后再進(jìn)行a=b的運算。 賦值表達(dá)式也可以包括復(fù)合的賦值運算符。例如: a+=a-=a*a 也是一個賦值表達(dá)式,此表達(dá)式運算比較復(fù)雜,先進(jìn)行a=a-a*a運算,得到a的值之后,進(jìn)行a=a+a運算。如果a的初值為12,最后得到的結(jié)果a=-264。 【例2-10】賦值運算符的使用。 #include"stdio.h" main() { inta,b; charc1,c2; a=b=48; /*將字符'0'的ASCII碼值48賦給a和b*/ c1=a+3; /*將a+3的值賦給c1,即字符'3'的ASCII碼賦給c1*/

c2=b+2; /*將b+2的值賦給c2,即字符'2'的ASCII碼賦給c2*/ printf("%c,%c,%c,%c",a,b,c1,c2); } 運行結(jié)果: 0,0,3,2 2.3.5不同類型數(shù)據(jù)間的轉(zhuǎn)換 C語言允許數(shù)據(jù)從一種類型轉(zhuǎn)換為另一種類型,以適應(yīng)各種不同的數(shù)據(jù)類型間的運算。 1.數(shù)據(jù)類型的自動轉(zhuǎn)換 數(shù)據(jù)類型的自動轉(zhuǎn)換常發(fā)生在以下情況中:(1)進(jìn)行運算時轉(zhuǎn)換。要求表達(dá)式中各操作數(shù)具有相同的數(shù)據(jù)類型,即不同類型數(shù)據(jù)進(jìn)行混算時進(jìn)行轉(zhuǎn)換。 (2)賦值轉(zhuǎn)換。把表達(dá)式值賦給與其不同類型的變量時進(jìn)行轉(zhuǎn)換。 (3)輸出轉(zhuǎn)換。其輸出值的類型與其指定輸出格式的類型不一致時,進(jìn)行轉(zhuǎn)換。 (4)函數(shù)調(diào)用轉(zhuǎn)換。在實參與形參類型不一致時,進(jìn)行轉(zhuǎn)換。 下面僅介紹算術(shù)運算轉(zhuǎn)換和賦值轉(zhuǎn)換,其他轉(zhuǎn)換在以后章節(jié)分別介紹。 2.不同類型數(shù)據(jù)間的混合運算圖2.6混合運算時不同類型數(shù)據(jù)間的轉(zhuǎn)換 整型、實型和字符型數(shù)據(jù)可以進(jìn)行混合運算。在進(jìn)行運算時,應(yīng)先把不同類型的數(shù)據(jù)轉(zhuǎn)換為同一類型,然后進(jìn)行運算,轉(zhuǎn)換規(guī)則,參見圖2.6所示。 圖中上、下兩個橫向向左箭頭表示必然轉(zhuǎn)換。也就是說,當(dāng)浮點型float數(shù)據(jù)在運算時一定要先轉(zhuǎn)換為double型數(shù)據(jù);字符型char數(shù)據(jù)在運算時,一定要先轉(zhuǎn)換為int整型數(shù)據(jù)。 圖中縱向箭頭表示不同類型數(shù)據(jù)運算時轉(zhuǎn)換的方向。也就是說,按由低到高方向轉(zhuǎn)換為相同類型即可進(jìn)行運算。例如,int型數(shù)據(jù)與long型數(shù)據(jù)進(jìn)行運算時,int型數(shù)據(jù)先轉(zhuǎn)換為long型數(shù)據(jù),然后運算,結(jié)果為long型數(shù)據(jù)。注意,只要由低向高轉(zhuǎn)換為相同類型數(shù)據(jù)即可,不能理解為要轉(zhuǎn)換為double型數(shù)據(jù)。 又如,int型數(shù)據(jù)、float型數(shù)據(jù)與double型數(shù)據(jù)進(jìn)行運算時,int型和float型都要先轉(zhuǎn)換為double型數(shù)據(jù),然后再參加運算,運算結(jié)果為double型。例如: 其運算后,d的結(jié)果為double型數(shù)據(jù)。 3.賦值轉(zhuǎn)換 在賦值語句中,如果賦值運算符兩邊類型不一致,但都是數(shù)值型或字符型數(shù)據(jù),則C語言允許賦值表達(dá)式右邊的值的類型自動轉(zhuǎn)換為左邊變量的類型,常見的賦值轉(zhuǎn)換如下。 (1)將整型數(shù)據(jù)賦給實型變量,這時數(shù)值不變,但以實型數(shù)據(jù)形式存到變量中。例如: floatf; f=23; /*將23轉(zhuǎn)換為23.000000,然后存入變量f中*/

(2)將實型數(shù)據(jù)賦給整型變量,這時舍棄小數(shù)部分,取整數(shù)部分賦給整型變量。例如: inti; i=2.68; /*i的值為2*/ (3)將int型整型數(shù)據(jù)賦給無符號型整型變量,int型數(shù)據(jù)按存儲單元中實際二進(jìn)制位的內(nèi)容直接賦給unsigned型變量。 若int型數(shù)據(jù)為正數(shù),即存儲單元中最高位為0,賦值后,則int型數(shù)據(jù)與unsigned型數(shù)據(jù)的數(shù)值相同。 若int型數(shù)據(jù)為負(fù)數(shù),即存儲單元中最高位為1,賦值后,unsigned型數(shù)據(jù)在使用時,最高位將代表一定的數(shù)值(16位二進(jìn)制數(shù),最高位代表216-1)。

【例2-11】輸出a和b所對應(yīng)的無符號型數(shù)據(jù)。 #include"stdio.h" main() { inta,b; unsignedu1,u2; a=1;b=-1; /*-1以補碼形式賦給b*/ u1=a; u2=b; /*-1的補碼為1111111111111111,直接賦給u2*/ printf("%d,%d,%u,%u",a,b,u1,u2); } 運行結(jié)果: 1,-1,1,65535 說明:執(zhí)行“a=1;b=-1;”后,有 高8位 低8位 a 00000000 00000001 b 11111111 1111111 執(zhí)行“u1=a;u2=b;”后,有

高8位 低8位 u1 00000000 00000001 u2 11111111 11111111 在輸出u2時,按無符號形式應(yīng)為65535。 (4)字符型數(shù)據(jù)賦給整型變量。字符型數(shù)據(jù)占1個字節(jié),而整型變量占2個字節(jié),因此賦值轉(zhuǎn)換過程中,存在位的擴展。 ①對于unsigned型變量,字符型數(shù)據(jù)(8位)傳送給unsigned變量的低8位,而unsigned變量的高8位只需補0。 ②對于int型變量,若字符型數(shù)據(jù)最高位為0,則int型變量的高8位補0;若字符型數(shù)據(jù)最高位為1,則int型變量的高8位補1。這樣可以保持?jǐn)?shù)值不變。 【例2-12】輸出c1和c2所對應(yīng)的無符號型數(shù)據(jù)。 #include"stdio.h" main() { inta,b; charc1,c2; c1='a';c2='\376'; a=c1; b=c2; printf("%d,%d,%d,%d\n",a,b,c1,c2); printf("%u,%u,%u,%u\n",a,b,c1,c2); }運行結(jié)果:97,-2,97,-297,65534,97,65534其存儲情況如下:高8位低8位c10000000001100001c20000000011111110a0000000001100001b1111111111111110 4.強制類型轉(zhuǎn)換 在C語言中,可以利用強制類型轉(zhuǎn)換符,將表達(dá)式的類型轉(zhuǎn)換為所需類型。 強制類型轉(zhuǎn)換的一般形式為 (類型名)表達(dá)式 例如:(int)a表示將a轉(zhuǎn)換成int類型; (int)(3.2+5)表示將(3.2+5)轉(zhuǎn)換成int類型,即將8.2 轉(zhuǎn)換成8; (float)(7%3)表示將(7%3)的值轉(zhuǎn)換成float型。 說明: (1)強制類型轉(zhuǎn)換時,表達(dá)式要用括號括起來,以防止出現(xiàn)錯誤。 例如,設(shè)x=3.2,y=2.5,則表達(dá)式(int)(x+y)表示將x+y的值5.7取整,即值為5;而對于表達(dá)式(int)x+y,則表示先對x取整后,再加實型變量y的值,表達(dá)式的值為實型,其值為5.5。 (2)強制類型轉(zhuǎn)換是將所需變量或表達(dá)式的值轉(zhuǎn)換為可需類型,但并不改變原來變量和表達(dá)式的類型屬性,也就是說原來變量或表達(dá)式的類型未發(fā)生任何變化。 (3)強制類型轉(zhuǎn)換運算符要用圓括號括起來,而變量定義時類型名直接書寫,在使用時易發(fā)生混淆,應(yīng)特別注意。 【例2-13】強制類型轉(zhuǎn)換。 #include"stdio.h" main() { inta,b,c; /*定義a,b,c為整型變量*/ floatx,y; /*定義x,y為實型變量*/ x=3.6;y=4.2; /*給x,y賦值*/ a=(int)x; /*將x值3.6轉(zhuǎn)為整型并賦給a*/ b=(int)(x+y);/*將x+y的值轉(zhuǎn)為整型并賦給b*/ c=a%b; /*a除以b的余數(shù)賦給c*/ x=x+y; /*x,y仍為實型,將其和賦給實型變量x*/ printf("a=%d,b=%d,c=%d,x=%f",a,b,c,x); }

運行結(jié)果: a=3,b=7,c=3,x=7.800000 從以上程序可以看出,在執(zhí)行“a=(int)x;”語句時,把x的值3.6轉(zhuǎn)換為整型數(shù)據(jù)3賦給a后,變量x的類型仍為實型。 上例也可縮寫為下列程序段: #include"stdio.h" main() { intc; floatx=3.6,y=4.2; c=(int)x%(int)(x+y); x=x+y; printf("c=%d,x=%f",c,x); } 運行結(jié)果: c=3,x=7.800000習(xí)題2 一、選擇題 2.1請選出可用作C語言用戶標(biāo)識符的一組標(biāo)識符()。 A)voidDefineWord B)a3_b3_123IF C)For-abcCase D)2aDosizeof

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論