第2章 數據類型和表達式_第1頁
第2章 數據類型和表達式_第2頁
第2章 數據類型和表達式_第3頁
第2章 數據類型和表達式_第4頁
第2章 數據類型和表達式_第5頁
已閱讀5頁,還剩107頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

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

C語言中的關鍵字標識符包括: 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)預定義標識符 在C語言中,預定義標識符一般是指C語言提供的庫函數名和預編譯處理命令(如printf、scanf、define)等。C語言允許這類標識符(函數名)另作它用,但這將使這些標識符失去系統規定的原意。為了編程時方便、可靠、避免誤解,一般把這些標識符固定使用。 3)用戶自定義標識符 用戶在進行編程時,需要自己對變量、函數、數組、文件和常量等進行命名,命名規則前面已有說明,這類由用戶根據需要自己定義的標識符稱為用戶自定義標識符。在使用用戶自定義標識符時應注意以下3點: (1)最好根據其含義選用英文縮寫及漢語拼音作標識符,這樣便于閱讀程序。 (2)決不能與關鍵字相同,否則編譯時給出錯誤信息。 (3)如果與預定義標識符相同,系統并不報錯,則程序仍能運行,只是預定義標識符失去原來的含義,代之以用戶確認的含義,這樣會造成編程混亂現象,應避免發生。 2)符號常量 使用常量可以提高程序運行速度,提高程序執行的效率,而使用標識符常量則可提高程序的易讀性、可修改性,便于調試程序,減少出錯機會。 如果在程序中多次出現一些很大的數字或很長的字符串,為了改進代碼的可讀性和可維護性,則可以給某一特定的值賦予一個名字,以后用到這個值時就用名字代表,這樣便于程序修改和閱讀,這個名字就是符號常量。符號常量有點像變量,但不能像對變量那樣修改符號常量,也不能對符號常量賦以新值。 下面看一個符號常量的例子。 【例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,有關#define命令的用法將在后面的章節中進行詳細介紹。

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

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

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

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

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

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

2)字符數據在內存中的存儲形式 將一個字符常量放在一個字符變量中,實際上并不是將字符的點陣信息或矢量信息放在內存中,而是將該字符的ASCII碼信息放在相應的內存中。 例如字符“a”的ASCII碼為97,字符“b”的ASCII碼為98,如果將其分別放在字符變量c1和c2中,十進制存儲形式如圖2.4(a)所示,實際上是以二進制的形式存儲的,如圖2.4(b)所示。 3)字符變量的賦值 可以將一個字符常量或字符變量賦值給一個字符變量,也可以將0~255的整型數據賦值給一個字符變量,并且字符變量、字符常量、0~255的整型數據之間可以進行運算。圖2.4字符數據在內存中的存儲(a)十進制存儲形式;(b)二進制存儲形式 【例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中存放的數據*/ printf("\nnextcharacterofc1:%c",c1+1); /*輸出字符A下面的字符*/ } 從該例中可以看出,C語言對字符的這種處理方法為程序設計增大了自由度。如可以對文字進行加密,即可以對字符作各種轉換。大寫字母A和B的ASCII碼為65和66,小寫字母a和b的ASCII碼為97和98,可以看出小寫字母的ASCII碼比其大寫字母大32,即'A'+32就得到'a',計算非常方便。 【例2-8】將大寫字母轉換為小寫字母,將小寫字母轉換為大寫字母。 #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); } 運行結果: c1=a,c2=B 4.字符串常量 1)字符串常量的定義 字符串常量是指用一對雙引號括起來的字符序列。如"howareyou!","$123","CHINA","a"都是字符串常量。 注意:C語言中沒有字符串變量,字符串存放在字符數組中,例如charc[5]={"CHINA"},詳細情況參見后面章節。 2)字符串常量在內存中的存儲形式 字符串常量在內存中存儲時一個字符占用一個字節,并且在字符串的末尾有一個結束符,C語言規定結束符為字符'\0',字符'\0'是指ASCII碼為0的字符。字符串必須有一個結束符。如果沒有結束符,則程序在輸出時不知到何處停止。例如,字符串"CHINA"在內存中的存儲情況如圖2.5所示。圖2.5字符串在內存中的存儲 2.2.4變量賦初值 變量賦初值是指在定義變量的同時對變量進行賦值。例如: inta=5; floatp=3.14; charc1='a'; 可以對被定義的變量的一部分賦初值。例如: inta,b,c=10; 如果對幾個變量賦予同一個值,則可以寫成 inta=b=c=d=10;

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

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

i++i-- 功能:先使用i的值,然后變量i的值增加(減少)1,即i=i±1。 例如: inta=3,b; b=a++; 執行后,b的值為3,a的值為4。 又如: inta=3,b; b=++a; 執行后,b的值為4,a的值為4。 2.自增、自減運算符的運算 自增、自減運算為單目運算,其運算數據為單操作數,且操作數只能是變量,不能是常量或表達式。如7++、(x+y)--均是錯誤的表示方法。 3.自增、自減運算符的結合性 自增、自減運算符屬右結合性。 例如,若有“inti=3;”則對于表達式-i++是理解為(-i)++呢,還是理解為-(i++)?因自增運算符只適用于變量,而-i不是變量,是表達式,顯然(-i)++從語法上說是錯誤的。而-i++的“-”號與“++”號同級,也就是說,變量i兩邊出現兩個級別相同的運算符,由于這種運算符屬右結合性,因此i應先與右邊的“++”號結合,即-i++等價于-(i++)。 又如:設有語句“inti=3,a;”,則表達式a=-(i++)等價于{a=-i;i=i+1;}。 由于“++”在i之后,故先使用i,然后使I的值增加1。執行該表達式后,a的值為-3,i的值為4。 在使用自增、自減運算符時應注意以下幾項: (1)使用++i或i++單獨構成語句時,其作用是等價的,均為i=i+1。 (2)運算對象只能是整型變量和實型變量。 (3)對于表達式(i++)+(i++)+(i++),不同的編程環境,其結果不同。若設“i=3;”,本書使用TurboC系統,表達式的值是9,i的值自增3次,結果為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++); /*運算由右至左,輸出結果為4,3,之后i=5*/

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

每一個表達式都有一個值,賦值表達式的值就是前面變量的值。例如“x=10”是一個賦值表達式,表達式的作用是將10賦給變量x,此表達式的值為10。“a=b=10”也是一個賦值表達式,因為賦值運算符的結合性是“自右至左”,所以表達式先進行b=10的運算,然后再進行a=b的運算。 賦值表達式也可以包括復合的賦值運算符。例如: a+=a-=a*a 也是一個賦值表達式,此表達式運算比較復雜,先進行a=a-a*a運算,得到a的值之后,進行a=a+a運算。如果a的初值為12,最后得到的結果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); } 運行結果: 0,0,3,2 2.3.5不同類型數據間的轉換 C語言允許數據從一種類型轉換為另一種類型,以適應各種不同的數據類型間的運算。 1.數據類型的自動轉換 數據類型的自動轉換常發生在以下情況中:(1)進行運算時轉換。要求表達式中各操作數具有相同的數據類型,即不同類型數據進行混算時進行轉換。 (2)賦值轉換。把表達式值賦給與其不同類型的變量時進行轉換。 (3)輸出轉換。其輸出值的類型與其指定輸出格式的類型不一致時,進行轉換。 (4)函數調用轉換。在實參與形參類型不一致時,進行轉換。 下面僅介紹算術運算轉換和賦值轉換,其他轉換在以后章節分別介紹。 2.不同類型數據間的混合運算圖2.6混合運算時不同類型數據間的轉換 整型、實型和字符型數據可以進行混合運算。在進行運算時,應先把不同類型的數據轉換為同一類型,然后進行運算,轉換規則,參見圖2.6所示。 圖中上、下兩個橫向向左箭頭表示必然轉換。也就是說,當浮點型float數據在運算時一定要先轉換為double型數據;字符型char數據在運算時,一定要先轉換為int整型數據。 圖中縱向箭頭表示不同類型數據運算時轉換的方向。也就是說,按由低到高方向轉換為相同類型即可進行運算。例如,int型數據與long型數據進行運算時,int型數據先轉換為long型數據,然后運算,結果為long型數據。注意,只要由低向高轉換為相同類型數據即可,不能理解為要轉換為double型數據。 又如,int型數據、float型數據與double型數據進行運算時,int型和float型都要先轉換為double型數據,然后再參加運算,運算結果為double型。例如: 其運算后,d的結果為double型數據。 3.賦值轉換 在賦值語句中,如果賦值運算符兩邊類型不一致,但都是數值型或字符型數據,則C語言允許賦值表達式右邊的值的類型自動轉換為左邊變量的類型,常見的賦值轉換如下。 (1)將整型數據賦給實型變量,這時數值不變,但以實型數據形式存到變量中。例如: floatf; f=23; /*將23轉換為23.000000,然后存入變量f中*/

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

【例2-11】輸出a和b所對應的無符號型數據。 #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); } 運行結果: 1,-1,1,65535 說明:執行“a=1;b=-1;”后,有 高8位 低8位 a 00000000 00000001 b 11111111 1111111 執行“u1=a;u2=b;”后,有

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

運行結果: a=3,b=7,c=3,x=7.800000 從以上程序可以看出,在執行“a=(int)x;”語句時,把x的值3.6轉換為整型數據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); } 運行結果: c=3,x=7.800000習題2 一、選擇題 2.1請選出可用作C語言用戶標識符的一組標識符()。 A)voidDefineWord B)a3_b3_123IF C)For-abcCase D)2aDosizeof

溫馨提示

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

評論

0/150

提交評論