C語言數據類型及轉換_第1頁
C語言數據類型及轉換_第2頁
C語言數據類型及轉換_第3頁
已閱讀5頁,還剩5頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、C語言的數據類型C語言提供的數據結構,是以數據類型形式出現的。具體分類如下:1. 基本類型分為整型、實型(又稱浮點型)、字符型和枚舉型四種。2. 構造類型分為數組類型、結構類型和共用類型三種。3. 指針類型。在第9章中介紹。4. 空類型C語言中的數據,有常量和變量之分,它們分別屬于上述這些類型。 本章將介紹基本類型中的整型、實型和字符型三種數據。2.3 常量和變量2.3.1 常量1. 常量的概念在程序運行過程中,其值不能被改變的量稱為常量。2. 常量的分類(1)整型常量(2 )實型常量(3)字符常量。(4)符號常量。常量的類型,可通過書寫形式來判別。2.3.2 變量1. 變量的概念在程序運行過

2、程中,其值可以被改變的量稱為變量。2. 變量的兩個要素(1)變量名。每個變量都必須有一個名字變量名,變量命名遵循標識符命名規則。(2)變量值。在程序運行過程中,變量值存儲在內存中。在程序中,通過變量名來引用變 量的值。3. 標識符命名規則(1 )有效字符:只能由字母、數字和下劃線組成,且以字母或下劃線開頭。(2 )有效長度:隨系統而異,但至少前8個字符有效。如果超長,則超長部分被舍棄。例如,由于student_name和student_number的前8個字符相同,有的系統認為這兩個變量, 是一 -回事而不加區別。在TC V2.0中,變量名(標識符)的有效長度為13 2個字符,缺省值為3 2。

3、(3)C語言的關鍵字不能用作變量名。注意:C語言對英文字母的大小敏感,即同一字母的大小寫,被認為是兩個不同的字符。 習慣上,變量名和函數名中的英文字母用小寫,以增加可讀性。思考題:在C語言中,變量名 total與變量名TOTAL ToTaL、tOtAl等是同一個變量嗎? 標識符命名的良好習慣一一見名知意:所謂“見名知意”是指, 通過變量名就知道變量值的含義。通常應選擇能表示數據含義的英文單詞(或縮寫)作變量名,或漢語拼音字頭作變量名。例如,name/xm (姓名)、sex/xb (性別)、age/nl (年齡)、salary/gz (工資)。4. 變量的定義與初始化在C語言中,要求對所有用到的

4、變量,必須先定義、后使用;且稱在定義變量的同時進行賦初值的操作為變量初始化。(1)變量定義的一般格式存儲類型數據類型變量名,變量名2;例如, float radius, length, area;( 2 )變量初始化的一般格式存儲類型數據類型 變量名=初值,變量名2=初值2;例如, float radius=2.5, length, area;2.4 整型數據2.4.1 整型變量1. 分類根據占用內存字節數的不同,整型變量又分為4類:(1) 基本整型(類型關鍵字為 int )。(2) 短整型(類型關鍵字為 short int)。(3) 長整型(類型關鍵字為long int )。(4) 無符號整

5、型。無符號型又分為無符號基本整型(unsigned int )、無符號短整型(unsigned short)和無符號長整型 ( unsigned long )三種, 只能用來存儲無符號整數。2. 占用內存字節數與值域上述各類型整型變量占用的內存字節數,隨系統而異。在 16位操作系統中,一般用2字節表示一個int型變量,且long型(4字節)int型(2字節)short型(2字 節)。顯然,不同類型的整型變量,其值域不同。占用內存字節數為n的(有符號)整型變量,其值域為:-2n*8-1 (2n*8-1 -1 );無符號整型變量的值域為:0 (2n*8-1 )。例如,PC機中的一個int型變量,其

6、值域為-2 2*8-1 (22*8-1 -1 ),即-3276832767 ; 一個 unsigned 型變量的值域為: 0(22*8-1 ),即 065535。2.4.2 整型常量1 .三種表示形式整型常量即整常數,在C語言中可用三種形式表示:(1 )十進制。例如 10、 36。(2)八進制(以數字0開頭)。例如 012。(3 )十六進制(以數字0+小寫字母x開頭)。例如0x36。2 . 分類(1)基本整型。在 16位機中,用 2字節存儲,其數據范圍與 int 型變量一樣。(2)長整型(在數值后面加“ L( l )”)。對超出基本整型值域的整型常量,可使用長整型常量表示,其取值范圍可達-2

7、3 1 - ( 2 3 1 - 1 )。例如,123l、315 L等。3. 類型匹配規則 類型匹配規則為:一個整型常量,可以賦給能容納下其值的整型變量。 例如,其值在-2 15 - (2 15 - 1)的整型常量,可以賦給int型變量和long int 型變量;其值在-231-(231-1)的整型常量,就只能賦給 long int 型變量。注意 :常量無 unsigned 型。但一個非負整型常量,只要它的值不超過相應變量的值域(即取值范圍),也可以賦給 unsigned 型變量。2.5 實型數據2.5.1 實型變量C語言的實型變量,分為兩種:(1) 單精度型。類型關鍵字為float,一般占4字

8、節(32位)、提供7位有效數字。(2) 雙精度型。類型關鍵字為double,一般占8個字節、提供1516位有效數字。2.5.2 實型常量1 .表示形式實型常量即實數,在C語言中又稱浮點數,其值有兩種表達形式:( 1 )十進制形式。例如 3.14 、 9.8 。(2)指數形式: 尾數E (e) 整型指數 。例如3.0 E +5等。2 . 關于類型實型常量不分 float 型和 double 型。一個實型常量, 可以賦給一個實型變量 ( float 型或 double 型)。2.6 字符型數據2.6.1 字符常量1 .字符常量的定義 用一對單引號括起來的單個字符,稱為字符常量。例如, A'

9、、1'、 + '等。2. 轉義字符C語言還允許使用一種特殊形式的字符常量,就是以反斜杠“ ”開頭的轉義字符。注意 :如果反斜杠或單引號本身作為字符常量,必須使用轉義字符:'、 案例 2.1 用轉義字符輸出可打印字符和不可打印字符。 案例代碼文件名:程序功能:/*/*AL2_1.C*/用轉義字符輸出可打印字符和不可打印字符*/main() printf( printf( 程序運行結果如下:OK!§? 程序演示 n”n”););/* 等價于 printf( “ OK!n” ); */2.6.2 字符變量字符變量的類型關鍵字為1.變量值的存儲字符變量用來存儲字符常量

10、。 將一個字符常量存儲到一個字符變量中,該字符的 ASCII 碼值(無符號整數)存儲到內存單元中。char ,一般占用1 字節內存單元。實際上是將例如,char ch1, ch2;/* 定義兩個字符變量: ch1 , ch2*/ch1=' a' ; ch2= ' b' ; /* 給字符變量賦值 */ 2. 特性字符數據在內存中存儲的是字符的ASCII碼一一 一個無符號整數,其形式與整數的存儲形式一樣(如圖2-4所示),所以C語言允許字符型數據與整型數據之間通用。1 )一個字符型數據,既可以字符形式輸出,也可以整數形式輸出。 案例 2.2 字符變量的字符形式輸出和

11、整數形式輸出。/* 案例代碼文件名: AL2_2.C*/* 程序功能:用字符形式和整數形式輸出字符變量 */ main() char ch1,ch2; ch1= a ; ch2= b ; printf( “ch1=%c,ch2=%c n” ,ch1,ch2);printf( “ ch1=%d,ch2=%d n” ,ch1,ch2); 程序運行結果: ch1=a,ch2=b ch1=97,ch2=98 (2)允許對字符數據進行算術運算,此時就是對它們的ASCII 碼值進行算術運算。案例 2.3 字符數據的算術運算。/*案例代碼文件名: AL2_3.C*/* 程序功能:字符數據的算術運算 */ m

12、ain() char ch1,ch2;ch1= a' ; ch2= B'/*字母的大小寫轉換 */printf( “ ch1=%c,ch2=%c n” ,ch1 -32,ch2+32);/*用字符形式輸出一個大于256 的數值 */printf("ch1+200=%dn", ch1+200); printf("ch1+200=%cn", ch1+200); printf("ch1+256=%dn", ch1+256); printf("ch1+256=%cn", ch1+256); 程序運行結果:

13、ch1=A,ch2=b ch1+200=297 ch1+200=) ch1+256=353 ch1+256=a 程序演示 思考題 :用字符形式輸出一個大于 256 的數值,會得到什么結果?2.6.3 字符串常量稱141. 字符串常量的概念和字符串長度 字符串常量是用一對雙引號括起來的若干字符序列。 字符串中字符的個數稱為字符串長度。 長度為 0 的字符串 (即一個字符都沒有的字符串) 為空串,表示為“ ” (一對緊連的雙引號)。例如,“ How do you do. ”、“ Good morning. ”等,都是字符串常量,其長度分別為 和 13 (空格也是一個字符)。如果反斜杠和雙引號作為字

14、符串中的有效字符,則必須使用轉義字符。II例如:(1) C:msdosv6.22 宀"C:msdosv6.22"2) I say:"Goodbye!"2. 字符串的存儲C語言規定:在存儲字符串常量時,由系統在字符串的末尾自動加一個0'作為字符串的結束標志。注意 :在源程序中書寫字符串常量時,不必加結束字符0',否則畫蛇添足。如果有一個字符串為“ CHINA,則它在內存中的實際存儲如下所示: 最后一個字符0是系統自動加上的,它占用6字節而非5字節內存空間。 綜上所述,字符常量 A 與字符串常量 "A" 是兩回事:(1)定

15、界符不同:字符常量使用單引號,而字符串常量使用雙引號;(2) 長度不同:字符常量的長度固定為1,而字符串常量的長度,可以是0,也可以是某個整數;(3) 存儲要求不同:字符常量存儲的是字符的ASCII 碼值,而字符串常量,除了要存儲有效的字符外,還要存儲一個結束標志'0'C語言中強制數據類型轉換字符型變量的值實質上是一個 8位的整數值,因此取值范圍一般是 -128127, char型變量 也可以加修飾符 unsigned,則unsigned char型變量的取值范圍是 0255(有些機器把char 型當做 unsighed char 型對待, 取值范圍總是 0255) 。 如果一

16、個運算符兩邊的運算數類型不同,先要將其轉換為相同的類型,即較低類型轉換 為較高類型,然后再參加運算,轉換規則如下圖所示。double <float 高longfunsignedint <char,short 低 圖中橫向箭頭表示必須的轉換,如兩個 float 型數參加運算,雖然它們類型相同,但仍 要先轉成 double 型再進行運算,結果亦為 double 型。 縱向箭頭表示當運算符兩邊的運算 數為不同類型時的轉換,如一個 long 型數據與一個 int 型數據一起運算,需要先將 int 型 數據轉換為 long 型, 然后兩者再進行運算,結果為 long 型。所有這些轉換都是由系

17、統自 動進行的, 使用時你只需從中了解結果的類型即可。這些轉換可以說是自動的,但然,C語言也提供了以顯式的形式強制轉換類型的機制。 當較低類型的數據轉換為較高類型時, 一般只是形式上有所改變, 而不影響數據的實質轉換的規則是:把賦值運內容, 而較高類型的數據轉換為較低類型時則可能有些數據丟失。 賦值中的類型轉換 當賦值運算符兩邊的運算對象類型不同時,將要發生類型轉換,算符右側表達式的類型轉換為左側變量的類型。具體的轉換如下:(1) 浮點型與整型 將浮點數 (單雙精度 )轉換為整數時,將舍棄浮點數的小數部分,只保留整數部分。即小數點后 帶若干個 0。將整型值賦給浮點型變量,數值不變,只將形式改為

18、浮點形式, 注意:賦值時的類型轉換實際上是強制的。(2) 單、雙精度浮點型由于C語言中的浮點值總是用雙精度表示的,所以float型數據只是在尾部加0延長為 doub1e 型數據參加運算,然后直接賦值。 doub1e 型數據轉換為 float 型時,通過截尾數來 實現,截斷前要進行四舍五入操作。(3) char 型與 int 型 int 型數值賦給 char 型變量時,只保留其最低 8 位,高位部分舍棄。 chr 型數值賦給 int 型變量時, 一些編譯程序不管其值大小都作正數處理,而另一些編 譯程序在轉換時,若 char 型數據值大于 127,就作為負數處理。對于使用者來講,如果原 來 cha

19、r 型數據取正值,轉換后仍為正值 ; 如果原來 char 型值可正可負,則轉換后也仍然保 持原值, 只是數據的內部表示形式有所不同。(4) int 型與 1ong 型 long 型數據賦給 int 型變量時,將低 16位值送給 int 型變量,而將高 16 位截斷舍棄。 (這里假定 int 型占兩個字節 )。將 int 型數據送給 long 型變量時,其外部值保持不變,而內部形式有所改變。(5) 無符號整數 將一個 unsigned 型數據賦給一個占據同樣長度存儲單元的整型變量時 (如:unsigned int、unsigned longlong , unsigned short short)

20、 ,原值照賦,內部的存儲方式不變,但外部值卻可能改變。 將一個非 unsigned 整型數據賦給長度相同的 unsigned 型變量時, 內部存儲形式不變, 但外部表示時總是無符號的。/* 例:賦值運算符舉例 */main() unsigned a,b;int i,j;a=65535;i=-1;j=a;b=i;prin tf("(u nsig ned)%u(in t)%d n",a,j);prin tf("(i nt)%d(un sig ned)%u n",i,b);運行結果為:(unsigned)65535 (int) -1(int)- 1t (un

21、sig ned)65535 計算機中數據用補碼表示, int 型量最高位是符號位,為 1 時表示負值,為 0 時表示正 值。如果一個無符號數的值小于 32768 則最高位為 0,賦給 int 型變量后、得到正值。如果 無符號數大于等于 32768,則最高位為 1,賦給整型變量后就得到一個負整數值。反之, 當 一個負整數賦給 unsigned 型變量時,得到的無符號值是一個大于 32768 的值。 C 語言這種賦值時的類型轉換形式可能會使人感到不精密和不嚴格,因為不管表達式的值怎樣,系統都自動將其轉為賦值運算符左部變量的類型。 而轉變后數據可能有所不同, 在不加注意時就可能帶來錯誤。 這確實是個

22、缺點,也遭到 許多人們批評。但不應忘記的是: c 面言最初是為了替代匯編語言而設計的,所以類型變換 比較隨意。當然,用強制類型轉換是一個好習慣, 這樣,至少從程序上可以看出想干什么。,在整型、實型和字符型數C語言規定,不同類型的數據需要轉換成同一類型后才可進行計算當混合不同類型的變量進行計算時, 相同類型的數據在轉換時有規則可循字符必須先轉換為整數(Cshort型轉換為int型(同屬于整型) float型數據在運算時一律轉換為雙精度 賦值時,一律是右部值轉換為左部類型注當整型數據和雙精度數據進行運算時, 進行運算,結果為雙精度類型數據當字符型數據和實型數據進行運算時, 進行計算,結果為實型數據

23、便可能會發生類型轉換語言規定字符類型數據和整型數據之間可以通用(double)型,以提高運算精度(同屬于實型)C先將整型數據轉換成雙精度型數據,再C先將字符型數據轉換成實型數據,然后2.4數據類型轉換在 C語言的表達式中,準許對不同類型的數值型數據進行某一操作或混合運算。當不同類型的數據進行操作時,應當首先將其轉換成相同的數據類型,操作。數據類型轉換有兩種形式,即隱式類型轉換和顯示類型轉換。241隱式類型轉換所謂隱式類型轉換就是在編譯時由編譯程序按照一定規則自動完成,而不需人為干預。因此,在表達式中如果有不同類型的數據參與同一運算時, 在編譯時自動按照規定的規則將其轉換為相同的數據類型。C語言

24、規定的轉換規則是由低級向高級轉換。例如,如果一個操作符帶有兩個類型不同的操 作數時,那么在操作之前行先將較低的類型轉換為較高的類型,然后進行運算,然后進行編譯器就運算結果是較高的類型。更確切地說,對于每一個算術運算符,則遵循圖2-2所示的規則。圖2-2數據類型轉換規則之一圖2-2數據類型轉換規則之一注意:在表達式中,所有的 float類型都轉換為double型以提高運算精度。在賦值語句中,如果賦值號左右兩端的類型不同,則將賦值號右邊的值轉換為賦值號左邊的類型,其結果類型還是左邊類型。因為函數參數是表達式,因此,當參數傳遞給函數時,也發生類型轉換。具體地說,char和short均轉換為int ;

25、 float轉換為double。這就是為什么我們把函數參數說明為int和double,盡管調用函數時用 char和float .也可以將圖2-2所示的規則用圖2-3表示。圖2-3中的水平箭頭表示必定轉換,縱向箭頭表示兩個操作對象類型不同時的轉換方向。flox百 hardw-*iidiatncd叭'1低慢 高盤圖2-3數據類型轉換規則之二下面舉行說明類型轉換的規則。例如執行:x=100+'a'+1.5 * u+f/'b'-s * 3.1415926其中,u為unsigned型,f為float 型,s為short型,x為float 型。式中右面表達式按 如下

26、步驟處理:(1) 首先將a'、b'和s換成int,將1.5和f轉換為double型。(2) 計算100+'a',因'a'已轉換為int型,于是此運算結果為197。(3) 計算1.5*u,由于1.5已轉換為double,u是unsigned型,于是首先u轉換為double, 然后進行運算,運算結果為double。(4) 計算 197+1.5 * u ,先將 197 轉換為 double (如 197.00 00),其結果為 double。(5) 計算f/ 'b', f已轉換為double , 'b'已轉換為int,于

27、是先將'b'再轉換為double ,其結果為double。(6) 計算(197+1.5 * u ) +f / 'b' ,者均為 double,于是結果也為 double。(7) 計算s * 3.1415926,先將s由int轉換為double,然后進行運算,其結果為double。(8) 最后與前面得的結果相減,結果為 double。(9) 最后將表達式的結果轉換為float并賦給x。2.4.2 顯式類型轉換顯示類型轉換又叫強制類型轉換,它不是按照前面所述的轉換規則進行轉換,而是直接將某數據轉換成指定的類型。這可在很多情況下簡化轉換。例如,int i ;i=i+9

28、.801按照隱式處理方式,在處理 i=i+9.801 時,首先i轉換為double型,然后進行相加,結果 為double型,再將double型轉換為整型賦給i。int i ;i=i+ (int ) 9.801這時直接將9.801轉換成整型,然后與i相加,再把結果賦給i。這樣可把二次轉換簡化為 一次轉換。顯示類型轉換的方法是在被轉換對象(或表達式)前加類型標識符,其格式是:(類型標識符)表達式例如,有如下程序段:main ()int a , b;float c ;b=a+int (c);printf ("b=d% n" , b);在上述程序的運行過程中,在執行語句 b=a+i

29、nt (c )時,將 c 的值臨時強制性轉化為 int 型,但變量 c 在系統中仍為實型變量, 這一點很重要, 不少初學者在這個問題上忽略了這個 問題。2.5 運算符和表達式 2.5.1 運算符和表達式概述 1表達式一個表達式包含一個或多 個操作, 操作的對象稱作運算元 (或叫作操作數) ,而操作本身通過運算符體現的。 例如 a、 a-b 、c=9.801 等都是一個表達式。一個表達式完成一個或多個操作, 最終得到一個結果, 而結果的數據類型由參加運算的操作 決定。最簡單的表達式是只含一個常量或變量的表達式,即只含一個操作數而不含運算符。C語言中表達式的種類十分豐富,主要有如下一些:n算術表達

30、式:進行一般的計算。n賦值表達式:進行賦值操作。n關系表達式:進行比較判斷。n邏輯表達式:進行邏輯比較判斷。n條件表達式:進行條件滿足與否的判斷。n逗號表達式:實際上是一種復雜運算,可以包含多個算術表達式。2. C語言的操作符C語言的特點之一是具有豐富和使用靈活的運算符,概括起來它有如下的幾類運算符:n來進行運算的)。算術運算符。賦值運算符(包括符合賦值運算符)。關系運算符。邏輯運算符。條件運算符。逗號運算符。位運算符。指針運算符。sizeof ()n這些運算符如表強制類型轉換運算符。2-4 所示。求字節運算符(可以歸并到函數的應用中去,它是通過函數表 2-4 C 語言中的運算符名稱操作符 自增,自減+ +, - - 邏輯與、或、非&&,|,!續表 2 4名稱操作符 指針操作及引用* ,& 加、減、乘、除、求模運算 +, * , / , % 關系操作符<,<=,>

溫馨提示

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

最新文檔

評論

0/150

提交評論