




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第2章數據類型及其運算1《C語言程序設計》第2章數據類型及其運算第2章數據類型及其運算2.1變量2.2常量2.3C語言的數據類型2.4運算符與表達式2.5數學函數2《C語言程序設計》第2章數據類型及其運算2.1變量2.1.1內存計算機中運行的程序,包括組成程序的指令和運行時所需要的數據,存儲在計算機的內存中。計算機采用二進制存儲數據,每一位二進制數稱為1個比特(bit)。每8位二進制數構成1個字節(byte),用大寫的B表示。為了方便訪問內存中的數據,給每個字節做一個標記,這個標記稱為地址。計算機的內存采用一維線性編址。計算機存儲系統常用的單位包括千字節(KB)、兆字節(MB)和吉字節(GB)。3《C語言程序設計》第2章數據類型及其運算《C語言程序設計》第2章數據類型及其運算4圖2-164KB內存空間示意圖2.1變量2.1.2變量的基本概念程序運行時,其值能被改變的量稱為變量。變量實質上就是計算機內存中一段有名字的由一個或若干個連續的字節構成的存儲空間。每個變量都有一個名字,通過變量的名字可以訪問到變量的存儲空間并獲得變量的數值。在C語言程序中通過定義變量來申請并命名這樣的存儲空間,并通過變量的名字來使用這段存儲空間。變量是程序中數據的臨時存放場所,可以用以保存程序運行時用戶輸入的數據和運算結果等。5《C語言程序設計》第2章數據類型及其運算2.1變量【例2.1】計算兩數之和。6《C語言程序設計》第2章數據類型及其運算源程序:#include<stdio.h>intmain(){
intm,n,sum; m=32; n=64; sum=m+n;
printf("sum=%d\n",sum); return0;}2.1變量2.1.2變量的基本概念1.變量定義源程序中:intm,n,sum;1行定義了3個用于存放整數的整型變量。int
表示整型數據類型。7《C語言程序設計》第2章數據類型及其運算《C語言程序設計》第2章數據類型及其運算8圖2-2定義變量后內存空間示意圖2.1變量2.1.2變量的基本概念2.變量賦值源程序中:m=32;n=64;2行為變量賦值。將“=”右邊的常量值賦給左邊的變量。9《C語言程序設計》第2章數據類型及其運算《C語言程序設計》第2章數據類型及其運算10圖2-3變量賦值后內存空間示意圖2.1變量2.1.2變量的基本概念3.運算并保存結果源程序中:sum=m+n;1行為計算m+n的值賦值給變量sum。11《C語言程序設計》第2章數據類型及其運算《C語言程序設計》第2章數據類型及其運算圖2-4保存運算結果后內存空間示意圖2.1變量2.1.2變量的基本概念4.顯示結果源程序中:printf("sum=%d\n",sum);1行在屏幕上顯示運算結果。運行結果:13《C語言程序設計》第2章數據類型及其運算sum=962.1變量2.1.2變量的基本概念4.顯示結果
printf()函數調用中"sum=%d\n"稱為格式控制。格式控制中除了%號開始加后面的字符(例如本例中的“%d”)外,其余字符按原樣輸出。由“%”字符開始的稱為格式說明,例如“%d”表示這里以有符號數十進制形式輸出一個整數,這個整數是格式控制"sum=%d\n"后面跟著的常量、變量或表達式的值,具體到本例就是"sum=%d\n"后面的變量sum的值。14《C語言程序設計》第2章數據類型及其運算2.1變量2.1.3變量定義在C語言中,變量的必須遵循“先定義,后使用”的原則。變量定義的格式:
數據類型變量1[,變量2,…,變量n];注:這里[]表示可選項。例如,例2.1中的語句“intm,n,sum;”。15《C語言程序設計》第2章數據類型及其運算2.1變量2.1.3變量定義每個變量必須有一個類型,如整型、字符型等,它指明給這個變量分配多大的存儲空間;每個變量還必須有一個名字,如x,y等,指明具體的變量名字。變量命名遵循標識符命名規則,習慣上,變量名用小寫字母表示,以增加可讀性。一般情況下變量應該先賦值再參與運算。一個變量的數值保存在該變量的存儲空間內,程序通過變量名可以引用變量值。16《C語言程序設計》第2章數據類型及其運算2.1變量2.1.4變量的命名規則--標識符與關鍵字C語言中的變量命名符合標識符的命名規則。1.關鍵字關鍵字又稱保留字,是C語言中預先規定的具有固定含義的一些單詞,已被C語言編輯工具本身使用,不能被程序員另作其他用途。C語言共有32個關鍵字。2.標識符(標記和識別對象的符號)標識符是指用來標識變量名、符號常量名、函數名、數組名、類型名等有效的字符序列。17《C語言程序設計》第2章數據類型及其運算2.1變量2.1.4變量的命名規則--標識符與關鍵字C語言規定:標識符只能由字母、數字、下劃線組成,并且只能由字母、下劃線開頭,不能是關鍵字。
如:abc、a12、x是合法的標識符,abc$、12a、x+y、int不是合法的標識符。18《C語言程序設計》第2章數據類型及其運算2.1變量2.1.4變量的命名規則--標識符與關鍵字使用標識符時要注意:(1)C語言對英文字母的大小寫敏感,即同一字母的大小寫被認為是兩個不同的字符。例如,total與TOTAL是不同的標識符。(2)標識符的命名最好是見名知意。即通過標識符就知道其所表示的含義。通常應選擇能表示數據含義的英文單詞(或縮寫)作標識符,或以漢語拼音字頭作標識符。例如:name/xm(姓名)、sex/xb(性別)、age/nl(年齡)、salary/gz(工資)。(3)標識符的有效長度隨系統而異,如果超長,則超長部分被舍棄。19《C語言程序設計》第2章數據類型及其運算2.1變量2.1.5變量的賦值與使用1.變量的賦值變量的值可以通過賦值表達式改變。
例如,例2.1中的賦值表達式“m=32”。實際上,變量在定義后其值是不確定的,因此在使用前應該先賦值,然后使用。變量的首次賦值可以稱為變量的初始化。
變量的初始化除了可以采用例2.1中所用的方式外,還可以在定義的同時進行初始化。20《C語言程序設計》第2章數據類型及其運算2.1變量【例2.2】計算兩數之和。21《C語言程序設計》第2章數據類型及其運算源程序:#include<stdio.h>intmain(){
intm=32,n=64,sum; sum=m+n;
printf("sum=%d\n",sum); return0;}運行結果:sum=962.1變量2.1.5變量的賦值與使用2.變量的使用變量可以參與運算,也可以保存運算結果。
例如,例2.2中的“sum=m+n;”語句,m,n是加法的兩個加數,sum用于存放運算結果。23《C語言程序設計》第2章數據類型及其運算2.2常量在程序運行時,其值不能被改變的量叫常量。在C語言中也可以用一個標識符代表一個常量,這種標識符稱為符號常量,即標識符形式的常量,一般用大寫字母。例如,用PI表示3.14159。24《C語言程序設計》第2章數據類型及其運算2.2常量【例2.3】常量的應用。25《C語言程序設計》第2章數據類型及其運算源程序:#include<stdio.h>intmain(){
printf("%d\n",1000); return0;}說明:源程序中的1000即為常量。運行結果:10002.2常量【例2.4】符號常量的使用。27《C語言程序設計》第2章數據類型及其運算total=300源程序:#include<stdio.h>#definePRICE30intmain(){intnum,total;num=10;total=num*PRICE;printf("total=%d\n",total);return0;}說明:程序中用“#definePRICE30”命令行定義PRICE代表常量30,此后凡在此源程序中出現的PRICE在預編譯階段均被30替換。運行結果:2.2常量使用符號常量的優點:(1)含義清楚。
例如,用PRICE代表價格,看程序時從PRICE就可知道它代表價格。在一個規范的程序中不提倡使用太多常數,應盡量使用“見名知意”的符號常量。(2)需要改變一個常量的值時能做到“一改全改”。
例如,在程序中多處用到某物品的價格,如果價格用常數表示,則在價格調整時,就需要在程序中作多處修改,若用符號常量PRICE代表價格,只需改動一處即可。注意:“#define”是預處理命令,不要以“;”號結束。29《C語言程序設計》第2章數據類型及其運算2.3C語言的數據類型在C語言中所使用的每個數據都具有一個明確的數據類型。不同類型的數據在數據表示形式、合法的取值范圍、占用內存空間大小及可以參與的運算種類等方面有所不同。C語言提供的數據類型分類見表“表2-2C語言的數據類型”。本章將主要介紹基本類型,包括整型、實型和字符型,其他類型的數據將在后續章節做詳細的介紹。30《C語言程序設計》第2章數據類型及其運算數據類型分類關鍵字基本類型整型基本整型int長整型long短整型short無符號整型unsigned實型(浮點型)單精度實型float雙精度實型double字符型char枚舉類型enum無類型void構造類型數組[]指針類型*結構體struct共用體union表2-2C語言的數據類型2.3.1整型1.整型常量整型常量,即整常數。C語言中整常數可用以下三種形式表示。(1)十進制整數。十進制整型常量直接用數字表示,例如:5、100、0、-10等。(2)八進制整數。以0開頭的數是八進制數。例如:05、0100等。(3)十六進制整數。以0x或0X開頭的數是十六進制數。例如:0x5、0x1A0等。32《C語言程序設計》第2章數據類型及其運算2.3.1整型【例2.5】八進制與十六進制數。33《C語言程序設計》第2章數據類型及其運算源程序:#include<stdio.h>intmain(){
inta=0123,b=0x123
printf("a=%d,b=%d\n",a,b); return0;}運行結果:a=83,b=2912.3.1整型2.整型變量(1)整型變量可分為有符號和無符號型兩大類。這兩類又分為基本型、短整型和長整型三類。有符號整型變量的存儲單元存儲的是對應數值的補碼。有符號型中又分為有符號整型、有符號短整型和有符號長整型,分別以signedint,signedshortint,signedlongint表示。35《C語言程序設計》第2章數據類型及其運算2.3.1整型2.整型變量無符號型整型變量的存儲單元中全部二進位都用作存數值,不包括符號。無符號型中又分為無符號整型、無符號短整型和無符號長整型,分別以unsignedint,unsignedshortint,unsignedlongint表示。無符號型變量只能存放不帶符號的整數,如123、4687等,而不能存放負數,如-123、-3。36《C語言程序設計》第2章數據類型及其運算2.3.1整型2.整型變量上述各類型整型變量占用的內存字節數,隨系統而異。在16位操作系統中(例如TC環境下),一般用2字節表示一個int型變量,long型4個字節、short型2個字節。在32位操作系統中(例如VC環境下),一般用4字節表示一個int型變量,long型4個字節、short型2個字節。顯然,不同類型的整型變量,其值域不同。37《C語言程序設計》第2章數據類型及其運算2.3.1整型2.整型變量n位有符號整數的取值范圍是:-2n-1~2n-1-1。因此2個字節的有符號整型的取值范圍是-215(-32768)~215-1(32767);4個字節的有符號整型的取值范圍是-231(-2147483648)~231-1(2147483647)。n位無符號整數的取值范圍是:0~2n-1。因此2個字節的有符號整型的取值范圍是0~216-1(65535);4個字節的有符號整型的取值范圍是0~232-1(4294967295)。38《C語言程序設計》第2章數據類型及其運算《C語言程序設計》第2章數據類型及其運算39類型符號關鍵字位數字節數數的表示范圍整型有[signed]int324-2147483648~2147483647[signed]short[int]162-32768~32767[signed]long[int]324-2147483648~2147483647無unsigned[int]3240~4294967295unsignedshort[int]1620~65535unsignedlong[int]3240~4294967295表2-3VC的整型數據注意:方括號內為可選項。例如:有符號短整型可以表示為signedshortint、shortint、signedshort或short。2.3.1整型2.整型變量(2)整型變量的定義。C語言規定在程序中所有用到的變量都必須在程序中指定其類型,即“定義”。例如:
inta,b;/*指定變量a,b為整型*/unsignedshortc,d;/*指定變量c,d為無符號短整型*/longe,f;/*指定變量e,f為長整型*/注意:變量的定義,一般是放在一個函數的開頭部分。40《C語言程序設計》第2章數據類型及其運算2.3.1整型【例2.6】整型變量的定義與使用。41《C語言程序設計》第2章數據類型及其運算源程序:#include<stdio.h>intmain(){
inta; unsignedb; a=-20; b=40;
printf("a=%d,b=%u\n",a,b); return0;}注意:printf()調用中的“%u”表示按無符號十進制整型輸出。運行結果:a=-20,b=402.3.1整型3.整型常量的類型前面討論了整型變量的類別。實際上整型常量也是有類別的。在將一個整型常量賦值給上述幾種類別的整型變量時要注意類型匹配。(1)一個整數值在-32768~+32767范圍內,可以賦值給2個字節或4個字節的整型變量。(2)一個整數值超過了-32768~+32767范圍,而在-2147483648~2147483647范圍內,可以賦值給4個字節的整型變量。如果賦值給2個字節的整型變量將發生溢出錯誤。43《C語言程序設計》第2章數據類型及其運算2.3.1整型3.整型常量的類型(3)如果一個C語言系統的shortint
與int型數據在內存中占據字節數相同,則二者的范圍也相同。(4)一個常量后面加一個字母u或U表示為unsigned型常量。例如,24u表示無符號整型常量。注意:一個非負值的整常量可以賦值給unsigned型整變量,只要它的范圍不超過變量的表示范圍即可。例如,將50000賦給一個unsignedshortint型變量是可以的,而將70000賦給它是不行的,會發生溢出錯誤。44《C語言程序設計》第2章數據類型及其運算2.3.1整型3.整型常量的類型(5)在一個整常量后面加一個字母l或L則認為是1ongint型常量。例如:123l、432L,這往往用于函數調用中。45《C語言程序設計》第2章數據類型及其運算2.3.2浮點型1.實型常量實型常量即實數,在C語言中又稱浮點數,實型常量有兩種表達形式:(1)十進制數形式:由數字和小數點組成。例如:3.14、9.8、.135等。注意:小數形式表示的實型常量必須要有小數點。(2)指數形式:尾數E(e)整型指數。例如:3.0E+5、123e3等。注意:字母E(或e)之前是十進制數形式的實數,之后是整數,二者都不可缺少。例如:e5、2.1e2.7、e等都不是合法的指數形式。46《C語言程序設計》第2章數據類型及其運算2.3.2浮點型2.實型變量C語言中實型變量分為單精度(float型)和雙精度(double型)兩類,每一個實型變量都應在使用前加以定義。例如:floatx,y;/*指定x,y為單精度實數*/doublez;/*指定z為雙精度實數*/47《C語言程序設計》第2章數據類型及其運算2.3.2浮點型2.實型變量在一般系統中,一個float型數據在內存中占4個字節,一個double型數據占8個字節。單精度實數的數值范圍約為-1038~1038,雙精度實數范圍約為-10308~10308。單精度實數提供7位有效數字,雙精度實數提供15~16位有效數字。實型常量不分float型和double型(很多C編譯系統將實型常量作為雙精度數來處理),一個實型常量,可以賦給一個實型變量(float型或double型),當然,這里要注意不要發生溢出錯誤。在實型常量后加字母f或F,表示它是float型。48《C語言程序設計》第2章數據類型及其運算2.3.2浮點型2.實型變量實型數據與整型數據的處理有所不同,整型數據是可以精確存儲的,而實型數據通常無法精確存儲。實型常量會根據變量的類型截取相應的有效位數字,因此要注意精度問題。49《C語言程序設計》第2章數據類型及其運算2.3.2浮點型2.實型變量例如,以下程序段輸出的結果為“a=111111.109375,b=111111.111000”。這是由于a為float型變量只能接收7位有效數字,因此最后兩位小數不起作用。而b為double型,則能全部接收全部9位數字。floata=111111.111;doubleb=111111.111;
printf("a=%f,b=%lf\n",a,b)注意:printf()調用中的“%f”和“%lf”分別表示按單精度實型和雙精度實型輸出后面的變量的值。50《C語言程序設計》第2章數據類型及其運算《C語言程序設計》第2章數據類型及其運算51類型符號關鍵字所占位數字節數數的表示范圍實型有float324-3.4e-38~3.4e38有double648-1.7e-308~1.7e308表2-4VC的實型數據2.3.3字符型1.字符常量C語言中的字符常量是用單引號括起來的一個字符,例如,'A'、'b'、'1'、'+'、'?'、'$'等都是字符常量。字符常量實質上就是字符對應的ASCII碼的值。例如,'A'實際上就是65。除了以上形式的字符常量外,C還允許用一種特殊形式的字符常量,就是以一個“\”開頭的字符序列,例如,前面已經遇到過的,在printf()函數中的'\n',它代表一個“換行”符。反斜杠引導的字符稱為轉義字符,其意思是將反斜杠(\)后面的字符變成另外的意思。如果字符常量是反斜杠或單引號本身,必須使用轉義字符:'\\'、'\'’表示。52《C語言程序設計》第2章數據類型及其運算《C語言程序設計》第2章數據類型及其運算53轉義字符含義轉義字符含義\n換行\t水平制表\v垂直制表\b退格\r回車\f換頁\a響鈴\\反斜線\'單引號\"雙引號\ddd1~3位8進制數代表的字符\xhh1~2位16進制數代表的字符表2-5轉義字符及其含義注:‘\ddd’和’\xhh’是用ASCII碼(八進制數、十六進制數)表示的一個字符。例如,‘\101’代表字符‘A’、‘\012’代表“換行”。這種方法可以表示ASCII碼碼表中的所有字符。2.3.3字符型【例2.7】轉義字符的應用。54《C語言程序設計》第2章數據類型及其運算源程序:#include<stdio.h>intmain(){ printf("\101\x42C\n");
printf("Isay:\"Howareyou?\"\n");
printf("\\CProgram\\\n");
printf("Turbo\'C\'\n"); return0;}注意:printf()調用中的“%u”表示按無符號十進制整型輸出。運行結果:ABCIsay:"Howareyou?"\CProgram\Turbo'C'2.3.3字符型【例2.8】轉義字符的應用。56《C語言程序設計》第2章數據類型及其運算源程序:#include<stdio.h>intmain(){
printf("Y\b=\n"); return0;}注意:printf()調用中的“%u”表示按無符號十進制整型輸出。運行結果:程序分析:實際上,程序輸出了字符“Y”,只是字符“Y”很快被后面字符“\b”回退一格所替代,因此屏幕上看不到字符“Y”。=2.3.3字符型2.字符變量字符型變量用來存儲字符常量。將一個字符常量存儲到一個字符變量中,實際上是將該字符的ASCII碼值存儲到內存單元中。字符變量的定義形式如下:charc1,c2;它表示c1和c2為字符型變量,分別可以用于存放一個字符,因此可以用下面語句對c1、c2賦值:c1='a';c2='b';58《C語言程序設計》第2章數據類型及其運算2.3.3字符型2.字符變量一般以一個字節來存放一個字符,或者說一個字符變量在內存中占一個字節。字符數據在內存中是以ASCII碼的值來存儲的,它的存儲形式與整數的存儲形式相類似。在C語言中,字符型數據和整型數據之間可以相互通用。一個字符數據既可以以字符形式輸出,也可以以整數形式輸出。以字符形式輸出時,需要先將存儲單元中數值根據ASCII碼碼表換成相應字符進行輸出。以整數形式輸出時,直接將存儲單元中的數值進行輸出。59《C語言程序設計》第2章數據類型及其運算2.3.3字符型【例2.9】字符變量分別以字符形式和整數形式輸出。60《C語言程序設計》第2章數據類型及其運算源程序:#include<stdio.h>intmain(){ charch1,ch2; ch1='a'; ch2='b';
printf("ch1=%c,ch2=%c\n",ch1,ch2);
printf("ch1=%d,ch2=%d\n",ch1,ch2); return0;}運行結果:程序分析:因為'a'和'b'的ASCII碼值為97和98。c1='a'和c2='b'是先將字符常量'a'和'b'轉換為字符所對應的ASCII碼值97和98,然后存放到內存單元中。“%c”表示將存儲單元的數值根據ASCII碼碼表換成相應字符進行輸出。“%d”表示將存儲單元的數值按十進制數進行輸出。ch1=a,ch2=bch1=97,ch2=982.3.3字符型2.字符變量字符數據與整型數據可以互相賦值。例如:
inti;charc;i='a';c=97;上述賦值是合法的。如果將i的值輸出得到97,如按字符形式輸出c可得字符'a'。C程序允許對字符數據進行算術運算,此時就是對它們的ASCII碼值進行算術運算。62《C語言程序設計》第2章數據類型及其運算2.3.3字符型【例2.10】字符數據的算術運算。63《C語言程序設計》第2章數據類型及其運算源程序:#include<stdio.h>intmain(){charch1,ch2;ch1='a';ch2='B';printf("ch1=%c,ch2=%c\n",ch1–32,ch2+32)printf("ch1+ch2=%d\n",ch1+ch2);return0;}運行結果:ch1=A,ch2=bch1+ch2=1632.3.3字符型3.字符串常量字符串常量是用一對雙引號括起來的若干字符序列。字符串中字符的個數稱為字符串長度。例如,"Howdoyoudo."、"Goodmorning."等,都是字符串常量,其長度分別為14和13(空格也是一個字符)。長度為0的字符串(即一個字符都沒有的字符串)稱為空串。65《C語言程序設計》第2章數據類型及其運算2.3.3字符型3.字符串常量如果反斜杠和雙引號作為字符串中的有效字符,則必須使用轉義字符。例如:(1)字符串C:\windows對應的字符串常量表示為"C:\\windows"(2)字符串Isay:"Goodbye!"對應的字符串常量表示為"Isay:\"Goodbye!\""66《C語言程序設計》第2章數據類型及其運算2.3.3字符型3.字符串常量不要將字符常量與字符串常量混淆,二者是完全不同的概念。字符常量使用單引號,而字符串常量使用雙引號。'a'是字符常量,"a"是字符串常量,兩者不同。假設c被指定為字符變量:charc;c='a';是正確的。而
c="a";是錯誤的。67《C語言程序設計》第2章數據類型及其運算2.3.3字符型3.字符串常量在C語言中,每一個字符串的結尾包含一個“字符串結束標志”,以便系統據此判斷字符串是否結束。C語言以字符'\0'作為字符串結束標志。'\0'是一個ASCII碼值為0的字符。空串""實際在內存中占有一個字節,即包含一個字符'\0'。68《C語言程序設計》第2章數據類型及其運算2.3.3字符型3.字符串常量例如:字符串"hello"內存中它占6個字節,最后一個字節為'\0':例如,在printf("Howdoyoudo.")中,輸出時一個一個字符輸出,直到遇到最后的'\0'字符,就知道字符串結束,停止輸出。注意,在寫字符串時不必加'\0',否則畫蛇添足。'\0'字符是系統自動加上的。69《C語言程序設計》第2章數據類型及其運算hello\02.3.3字符型3.字符串常量字符串"a",實際上包含2個字符:'a'和'\0',因此,把它賦給一個字符變量是錯誤的。嚴格的說,在C語言中字符串只有常量,沒有變量,而且字符串不是一種數據類型。在C語言中字符串如果需要按變量的方式進行處理,需要用字符數組來存放,即用一個字符型數組來存放一個字符串。70《C語言程序設計》第2章數據類型及其運算2.3.4類型轉換在C語言中,整型、實型和字符型數據間可以混合運算。如果一個運算符兩側的操作數的數據類型不同,則系統按“先轉換、后運算”的原則,首先將數據自動轉換成同一類型,然后在同一類型數據間進行運算。類型轉換有自動進行的,也有強制執行的。前者稱為隱式類型轉換,后者稱為強制類型轉換。71《C語言程序設計》第2章數據類型及其運算2.3.4類型轉換1.隱式類型轉換隱式類型轉換主要又可分為兩類:算術轉換和賦值轉換。(1)算術轉換:算術轉換主要出現在算術運算過程中,轉換規則如圖2-5所示。72《C語言程序設計》第2章數據類型及其運算《C語言程序設計》第2章數據類型及其運算73圖2-5算術運算中的類型轉換規則2.3.4類型轉換說明:(1)圖中橫向向左的箭頭表示必定進行的轉換,也就是說系統會先將char型數據轉換為int型行數據、short型數據先轉換為int型數據、float型數據轉換為double型數據,然后進行運算。例如,當兩個float型數據做加法運算時系統首先將2個加數換成雙精度型然后再相加以提高運算精度。74《C語言程序設計》第2章數據類型及其運算2.3.4類型轉換說明:(2)縱向的箭頭表示當運算對象為不同類型時轉換的方向。例如,int型與double型數據進行運算,先將int型的數據轉換成double型,然后兩個同類型(double型)數據進行運算,結果為double型。75《C語言程序設計》第2章數據類型及其運算2.3.4類型轉換注意:箭頭方向只表示數據類型級別的高低,由低向高轉換,不要理解為int型先轉換成unsigned型,再轉換成long型,再轉換成double型。如果一個int型數據與一個double型數據運算,是直接將int型轉換成double型。同理,一個int型與一個long型數據運算,先將int型轉直接換成long型。76《C語言程序設計》第2章數據類型及其運算2.3.4類型轉換假設定義ch為字符型變量,i為整型變量,f為float型變量,d為double型變量,則下式:
ch/i+f*d–(f+i)運算過程如圖示。77《C語言程序設計》第2章數據類型及其運算2.3.4類型轉換(2)賦值轉換:賦值轉換主要出現在賦值表達式中,不管賦值運算符右邊是什么類型,都要轉換為賦值運算符左邊的變量類型。若賦值運算符右邊的值大于左邊變量的表示范圍,則賦值時會發生溢出錯誤。78《C語言程序設計》第2章數據類型及其運算2.3.4類型轉換2.強制類型轉換C語言提供了強制類型轉換運算符來實現強制類型轉換。語法格式:(類型)表達式例如:(int)3.579《C語言程序設計》第2章數據類型及其運算2.3.4類型轉換2.強制類型轉換如果一個變量在進行運算時進行了強制類型轉換,使用強制轉換類型得到的是一個所需類型的中間量,變量本身的類型及數值都不會發生變化。例如:
intx=5;floaty=3.5;x=x+(int)yy的值是3.5,在進行加法運算時強制轉換為int型、值為3參與運算。運算結束后,y仍然是float型,其值仍然是3.5。80《C語言程序設計》第2章數據類型及其運算2.3.5選擇正確的數據類型在進行C語言程序設計過程中正確選擇數據類型是非常重要的,下面以2道例題進行說明。81《C語言程序設計》第2章數據類型及其運算2.3.5選擇正確的數據類型【例2.11】整型數據的溢出。82《C語言程序設計》第2章數據類型及其運算源程序:#include<stdio.h>intmain(){
inta,b; a=32767; b=a+1;
printf("a=%d,b=%d\n",a,b); return0;}在TC環境下的運行結果:
在VC環境下的運行結果:a=32767,b=-32768a=32767,b=327682.3.5選擇正確的數據類型程序分析:TC環境是一個16位的開發環境,int類型的變量是用2個字節存放采用補碼進行編碼的有符號數。2個字節的補碼的表示范圍為-32768~32767。32767加1后產生溢出。實際上32767的補碼為0111111111111111B,加1后變為,1000000000000000B,這是-32768的補碼,所以變量b輸出的值為-32768。VC環境是一個32位的開發環境,int是用4個字節存放采用補碼進行編碼的有符號數。4個字節的補碼的表示范圍為-2147483648~2147483647。32767加1后不會產生溢出。84《C語言程序設計》第2章數據類型及其運算在TC環境下將程序修改為:#include<stdio.h>intmain(){ longinta,b; a=32767; b=a+1;
printf("a=%ld,b=%ld\n",a,b); return0;}注意:printf()函數調用中的“%ld”表示按長整型輸出后面變量的值。運行結果:a=32767,b=327682.3.5選擇正確的數據類型【例2.12】華氏溫度到攝氏溫度的轉換。轉換公式為:
式中:f代表華氏溫度,c代表攝氏溫度。86《C語言程序設計》第2章數據類型及其運算源程序:#include<stdio.h>intmain(){ floatf,c; f=64.0; c=(5/9)*(f–32);
printf("f=%f\nc=%f\n",f,c); return0;}式中printf()函數調用中“%f”表示按實數形式輸出數據。運行結果:f=64.000000c=0.0000002.3.5選擇正確的數據類型結果分析:“c=0.000000”顯然是錯誤的。“/”是除法運算,如果被除數和除數都是整數,則其結果也是整除(小數部分被舍去)。因為5和9都是整型常量,所以“5/9”的結果是0。如果要獲得正確結果,只需要將程序中的整型常量“5”改為實型常量“5.0”即可。修改后的運行結果:88《C語言程序設計》第2章數據類型及其運算f=64.000000c=17.7777782.3.6sizeof運算符sizeof是C語言的一種單目運算符,sizeof運算符以字節形式給出了其操作數的存儲空間大小。可以利用sizeof運算符判斷數據類型的字節長度。使用方法:
sizeof(類型說明符);注意:sizeof不是一個函數,字節數的計算在程序編譯時進行,而不是在程序執行過程中才計算出來。89《C語言程序設計》第2章數據類型及其運算2.3.6sizeof運算符【例2.13】確定整型數據類型的字節長度。90《C語言程序設計》第2章數據類型及其運算源程序:#include<stdio.h>intmain(){
printf("%d,%d,%d\n",sizeof(short
int),
sizeof(int),sizeof(long
int)); return0;}在TC(16位系統)環境下的運行結果:
在VC(32位系統)環境下的運行結果:
程序分析:在TC中,int變量占2個字節;在VC中,int變量占4個字節。2,2,42,4,42.4運算符與表達式運算符是告訴編譯程序執行特定算術或邏輯操作的符號。C語言的運算范圍很寬,除了控制語句和輸入輸出以外的幾乎所有的基本操作都作為運算符處理。運算符主要分為三大類:算術運算符、關系運算符與邏輯運算符。除此之外,還有一些用于完成特殊任務的運算符。運算符、常量和變量構成C語言的表達式。92《C語言程序設計》第2章數據類型及其運算2.4.1運算符的優先級與結合性C語言規定了運算符的優先級和結合性。C語言中運算符的優先級共分為15級,1級最高,15級最低。在表達式中,一個操作數兩側的運算符優先級不同時,先進行優先級較高的運算;兩側的運算符優先級相同時,按運算符的結合性所規定的結合方向處理。93《C語言程序設計》第2章數據類型及其運算2.4.1運算符的優先級與結合性所謂結合性是指,當一個操作數兩側的運算符具有相同優先級時該操作數是先與左邊的運算符結合,還是先與右邊的運算符結合。自左至右的結合方向,稱為左結合性。反之,稱為右結合性。例如,算術運算符的結合性是左結合性,因此,表達式“x-y+z”先執行“x-y”運算,然后再執行“+z”運算。再如賦值運算符的結合性是右結合性,因此,表達式“x=y=z”先執行“y=z”運算,然后再執行變量x的賦值運算。94《C語言程序設計》第2章數據類型及其運算2.4.2算術運算符和算術表達式1.算術運算符算術運算符有五種,如表2-6所示。95《C語言程序設計》第2章數據類型及其運算96《C語言程序設計》第2章數據類型及其運算+加法運算符,如3+6正值運算符,如+2-減法運算符,如6-3負值運算符,如-2*乘法運算符,如3*6/除法運算符,如6/3%求余運算符(或稱模運算符),如7%4表2-6五種基本算術運算符2.4.2算術運算符和算術表達式注意:(1)運算符“%”只用于整型(包括字符型,實際上字符型可以看作是1個字節的整型),它的兩側都必須是整型操作數。如果不是整型數,必須將操作數強制轉換成整型再進行求余運算,否則將出現編譯錯誤。(2)若操作數中有負值,求余的原則為:先取絕對值求余數,余數的符號取被除數的符號。例如:-10%3的結果為-1;10%-3的結果為1,即采取“向零取整”的方法。97《C語言程序設計》第2章數據類型及其運算2.4.2算術運算符和算術表達式2.算術運算符的優先級與結合性算術運算符的優先級:先乘除、后加減;括號優先。算術運算符的結合性:左結合性。98《C語言程序設計》第2章數據類型及其運算2.4.2算術運算符和算術表達式3.算術表達式算術表達式是指用算術運算符和括號將運算對象(也稱操作數,如常量、變量、函數等)連接起來,符合C語法規則的式子。例如:
a+b*c+d
根據算術運算符的優先級與結合性,算術表達式“a+b*c+d”等效為“(a+(b*c))+d”。99《C語言程序設計》第2章數據類型及其運算2.4.2算術運算符和算術表達式4.自增運算符和自減運算符(1)自增運算符
自增運算符(++)是單目運算符,其作用使單個變量的值增1。自增運算符有兩種使用情況:1)前置:++i。先執行i=i+1,再使用i值;2)后置:i++。先使用i值,再執行i=i+1。100《C語言程序設計》第2章數據類型及其運算2.4.2算術運算符和算術表達式例如:j=3; k=++j;
執行“k=++j”語句后,k=4,j=4。上述語句等效為:j=3; j=j+1; k=j;再如:j=3; k=j++;
執行“k=j++;”語句后,k=3,j=4。上述語句等效為:j=3; k=j; j=j+1;101《C語言程序設計》第2章數據類型及其運算2.4.2算術運算符和算術表達式(2)自減運算符
自減運算符(--)也是單目運算符,其作用使單個變量的值減1。自減運算符種類也有兩種使用情況:前置:--i。先執行i=i-1,再使用i值;后置:i--。先使用i值,再執行i=i-1。102《C語言程序設計》第2章數據類型及其運算2.4.2算術運算符和算術表達式例如:j=3; k=--j;
執行“k=--j;”語句后,k=2,j=2。上述語句等效為:j=3; j=j-1; k=j;再如:j=3; k=j--;
執行“k=j--;”語句后,k=3,j=2。上述語句等效為:j=3; k=j; j=j-1103《C語言程序設計》第2章數據類型及其運算2.4.2算術運算符和算術表達式說明:①自增運算符(++)、自減運算符(--),只能用于變量,不能用于常量和表達式。
例如,5++、--(a+b)等都是非法的。因為5是常量,常量的值不能改變。(a+b)++也不可能實現,假如a+b的值為5,那么自增后得到的6放在什么地方呢?無變量可供存放。104《C語言程序設計》第2章數據類型及其運算2.4.2算術運算符和算術表達式說明:②++和--的結合方向是“自右至左”,其優先級高于算術運算符。
例如,i=3,-i++相當于-(i++),因此表達式的值為-3,i=4。③自增運算符、自減運算符,常用于循環語句中,使循環控制變量加(或減)1,以及指針變量中,使指針指向下(或上)一個地址。105《C語言程序設計》第2章數據類型及其運算2.4.3賦值運算符和賦值表達式1.賦值運算符賦值運算符“=”的作用是將一個數據賦給一個變量。語法格式:
變量=表達式功能:將“=”右側的常量或表達式計算所得的值賦給左側的變量。例如,“x=5”的作用是執行一次賦值操作,將常量5賦給變量x。106《C語言程序設計》第2章數據類型及其運算2.4.3賦值運算符和賦值表達式2.復合賦值運算符在賦值符“=”之前加上其他雙目運算符,可以構成復合賦值運算符。語法格式:
變量雙目運算符=表達式其中“雙目運算符=”就是復合賦值運算符。它等價于:變量=變量雙目運算符表達式107《C語言程序設計》第2章數據類型及其運算2.4.3賦值運算符和賦值表達式例如:a+=3等價于a=a+3x%=3等價于x=x%3x*=y+8等價于x=x*(y+8)/*注意:“+”的優先級高于“*=”*/C語言規定的10種復合賦值運算符如下:+=,-=,*=,/=,%=;/*復合算術運算符5個*/&=,^=,|=,<<=,>>=。/*復合位運算符5個*/108《C語言程序設計》第2章數據類型及其運算2.4.3賦值運算符和賦值表達式3.賦值運算符的優先級與結合性賦值運算符和復合賦值運算符的優先級為14級,在所有C語言的運算符中僅高于逗號運算符。賦值運算符和復合賦值運算符的結合性:右結合性。109《C語言程序設計》第2章數據類型及其運算2.4.3賦值運算符和賦值表達式4.賦值表達式由賦值運算符將一個變量和一個表達式連接起來的式子稱為賦值表達式。語法格式:變量賦值運算符/復合賦值運算符表達式例如:“a=5”、“a+=5”都是賦值表達式。賦值表達式的求解過程:將賦值運算符右側的“表達式”的值賦給左側的變量。110《C語言程序設計》第2章數據類型及其運算2.4.3賦值運算符和賦值表達式4.賦值表達式賦值表達式的值:賦值運算結束后,賦值表達式左側變量的值就是賦值表達式的值。例如,賦值表達式“a=5”的值為5(變量a的值也是5)。例如,根據賦值運算符的結合性,表達式“a=b=10”等價于“a=(b=10)”,即先將常量10賦給變量b,賦值表達式“b=10”的值為10,再將賦值表達式“b=10”的值(10)賦給變量a。111《C語言程序設計》第2章數據類型及其運算2.4.3賦值運算符和賦值表達式在C語言中,賦值表達式可以出現在其它表達式中參與運算。例如,加法表達式“(b=4)+(c=6)”。執行該表達式后:b等于4;c等于6;表達式的值為10。將賦值運算作為一種表達式,使賦值操作不僅可以構成賦值語句,而且可以出現在其它表達式中,這是C語言靈活性的一種表現。112《C語言程序設計》第2章數據類型及其運算2.4.3賦值運算符和賦值表達式下面是一些賦值表達式的例子:a=b=c=5 (表達式值為5,a、b、c值均為5)a=5+(c=6) (表達式值為11,a值為11,c的值為6)a=(b=4)+(c=6) (表達式值為10,a值為10,b值為4,c值為6)a=(b=10)/(c=2) (表達式值為5,a值為5,b值為10,c值為2)113《C語言程序設計》第2章數據類型及其運算2.4.4關系運算符和關系表達式1.關系運算符所謂“關系運算”實際上就是“比較運算”,即將兩個數據進行比較,判定兩個數據是否符合給定的關系。例如,“a>b”中的“>”表示大于關系運算。如果a的值是5,b的值是3,則大于關系運算“>”的結果為“真”,即條件成立;如果a的值是2,b的值是3,則大于關系運算“>”的結果為“假”,即條件不成立。114《C語言程序設計》第2章數據類型及其運算2.4.4關系運算符和關系表達式C語言提供6種關系運算符:<(小于) <=(小于或等于) >(大于) >=(大于或等于)==(等于) !=(不等于)注意:在C語言中,“等于”關系運算符是雙等號“==”,而不是單等號“=”。單等號“=”是賦值運算符。115《C語言程序設計》第2章數據類型及其運算2.4.4關系運算符和關系表達式關系運算符的優先級:(1)在關系運算符中,前4個優先級相同,后2個也相同,且前4個高于后2個。(2)關系運算符的優先級,低于算術運算符,高于賦值運算符。關系運算符的結合性:左結合性。116《C語言程序設計》第2章數據類型及其運算2.4.4關系運算符和關系表達式3.關系表達式關系表達式是指用關系運算符將兩個表達式連接起來進行關系運算的式子。例如,下面的關系表達式都是合法的:a>b,a+b>c-d,(a=3)<=(b=5),'a'>='b',(a>b)==(b>c)關系運算的結果非“真”即“假”。在C語言中沒有邏輯型數據,“邏輯真”用整數“1”表示,“邏輯假”用整數“0”表示。即關系表達式的值是1(真)或0(假)。關系表達式的值,還可以參與其他運算,例如算術運算、邏輯運算等。117《C語言程序設計》第2章數據類型及其運算2.4.4關系運算符和關系表達式下面是一些關系表達式的例子(假設num1=3,num2=4,num3=5):(1)num1>num2的值為0(假)。(2)(num1>num2)!=num3的值為1(真)。因為“num1>num2”的值為0,num3的值為5,二則不相等為真。(3)num1<num2<num3的值為1(真)。因為關系運算符為左結合性,先計算表達式“num1<num2”,其值為1,而num3的值為5,1<5為真。(4)(num1<num2)+num3的值為6。這是一個加法表達式,因為“num1<num2”的值為1,num3的值為5,1+5=6。(5)num3>num2>num1的值為0(假)。因為關系運算符為左結合性,先計算表達式“num3>num2”,其值為1,而num1的值為3,1>3為假。118《C語言程序設計》第2章數據類型及其運算2.4.5邏輯運算符和邏輯表達式1.邏輯運算符在C語言中有三種邏輯運算符:&&(邏輯與)、||(邏輯或)和!(邏輯非)。邏輯運算符的運算規則:(1)&&:當且僅當兩個運算量的值都為“真”時,運算結果為1(真),否則為0(假)。(2)||:當且僅當兩個運算量的值都為“假”時,運算結果為0(假),否則為1(真)。(3)!:當運算量的值為“真”時,運算結果為0(假);當運算量的值為“假”時,運算結果為1(真)。119《C語言程序設計》第2章數據類型及其運算2.4.5邏輯運算符和邏輯表達式注意:(1)關系表達式和邏輯表達式的運算結果都是1或0,用整數“1”表示“邏輯真”,用“0”表示“邏輯假”。(2)在C語言中,在判斷一個數據表示的是“真”還是“假”時,是以0和非0為根據。如果數據為0,則表示“邏輯假”;如果為非0,則表示“邏輯真”。C語言中的邏輯運算如表2-7所示。120《C語言程序設計》第2章數據類型及其運算《C語言程序設計》第2章數據類型及其運算121變量a變量b非!a與a&&b或a||b非0非0011非000010非010100100表2-7C語言中的邏輯運算例如,!5的值為0。2.4.5邏輯運算符和邏輯表達式2.邏輯運算符的優先級與結合性(1)邏輯非的優先級最高,邏輯與次之,邏輯或最低。即由高到低依次為:!→&&→||。(2)邏輯運算符與其他種類運算符的優先級關系。由高到低依次為:!→算術運算→關系運算→&&→||→賦值運算。(3)邏輯運算符是左結合性。122《C語言程序設計》第2章數據類型及其運算2.4.5邏輯運算符和邏輯表達式3.邏輯表達式邏輯表達式是指用邏輯運算符將一個或多個表達式連接起來進行邏輯運算的式子。例如,下面的表達式都是邏輯表達式:(x>=0)&&(x<10)(x<1)||(x>5)!(x==0)(year%4==0)&&(year%100!=0)||(year%400==0)123《C語言程序設計》第2章數據類型及其運算2.4.5邏輯運算符和邏輯表達式說明:(1)邏輯運算符兩側的操作數,除可以是0和非0的整數外,也可以是其他任何類型的數據,如實型、字符型等。(2)在計算邏輯表達式時,只有在必須執行下一個表達式才能求解時,才求解該表達式。也就是說:對于邏輯與運算,如果第一個操作數被判定為“假”,系統不再判定或求解第二操作數;對于邏輯或運算,如果第一個操作數被判定為“真”,系統不再判定或求解第二操作數。124《C語言程序設計》第2章數據類型及其運算2.4.5邏輯運算符和邏輯表達式例如:
in
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 露營地服務行業跨境出海戰略研究報告
- ABS合金行業跨境出海戰略研究報告
- 立式廣告機企業制定與實施新質生產力戰略研究報告
- 辦公樓行業直播電商戰略研究報告
- 2025-2030高跟靴行業行業風險投資發展分析及投資融資策略研究報告
- 2025-2030高檔衛浴市場前景分析及投資策略與風險管理研究報告
- 2025-2030香精香料行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030食品包裝用鋁箔行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030雨傘行業行業風險投資發展分析及投資融資策略研究報告
- 制作數字作品(教案)三年級下冊信息技術蘇科版
- 小區景觀水系清淤施工方案
- 英語課堂游戲PPT-連詞成句搭橋游戲
- 人類應不應該限制人工智能的發展辯論賽正方辯詞一辯、二辯、三辯、四辯發言稿
- Unit5Poems單元整體教學設計-高中英語人教版(2019)選擇性單元整體教學設計(視頻課件教案)
- 高中英語高考詞性轉換匯總(5類詞形轉換、7組核心詞匯轉換)
- 非暴力溝通 情緒篇
- 氫氧化鈣化學品安全技術說明書
- 2023-2024學年福建省晉江市南安市小學語文六年級期末高分題附參考答案和詳細解析
- 醫保應急處理預案制度
- 人民醫院整形外科臨床技術操作規范2023版
- 實驗一 顯微鏡的使用及微生物形態的觀察
評論
0/150
提交評論