第2部分數(shù)據(jù)類型運算符和達式_第1頁
第2部分數(shù)據(jù)類型運算符和達式_第2頁
第2部分數(shù)據(jù)類型運算符和達式_第3頁
第2部分數(shù)據(jù)類型運算符和達式_第4頁
第2部分數(shù)據(jù)類型運算符和達式_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、白 雪 飛中國科學(xué)技術(shù)大學(xué)電子科學(xué)與技術(shù)系dept. of elec. sci. & tech., ustcfall, 2003第第2章章 數(shù)據(jù)類型、運算符和表達式數(shù)據(jù)類型、運算符和表達式目 錄l數(shù)據(jù)類型、常量和變量的定義l運算符的種類、優(yōu)先級和結(jié)合方向l表達式的類型和求值l簡單的c程序設(shè)計及基本輸入輸出c的數(shù)據(jù)類型 (data types)l基本類型n整型、字符型、浮點型(實型)、枚舉類型l構(gòu)造類型n數(shù)組類型、結(jié)構(gòu)體類型、共用體類型l指針類型l空類型數(shù)據(jù)類型、常量和變量lc的數(shù)據(jù)結(jié)構(gòu)是以數(shù)據(jù)類型形式出現(xiàn)的l由前述數(shù)據(jù)類型可以構(gòu)造出更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)lc語言的數(shù)據(jù)有常量和變量之分l常量和

2、變量都分別屬于某一數(shù)據(jù)類型l程序中用到的所有數(shù)據(jù)都必須指定類型l本章僅介紹基本數(shù)據(jù)類型標識符 (identifier)l標識符n變量名、符號常量名、函數(shù)名、類型名l標識符命名規(guī)范n由字母、數(shù)字、下劃線(underscore, _)組成n第一個字符必須為字母或下劃線nc語言標識符是大小寫敏感的n標識符的名稱一般應(yīng)具有一定的含義n不要與c語言關(guān)鍵字(keywords)重復(fù)n一般不要使用以下劃線開頭的標識符標識符示例l正確的標識符nstudent、num1、_sum、_1_2_3nmyname、myname、my_namel錯誤的標識符nroom3-1包含了其他字符(減號)n2men以數(shù)字開頭nlo

3、ng與關(guān)鍵字重復(fù)nmr.zhu包含了其他字符(小數(shù)點)常量 (constants)l常量n程序運行過程中,其值不能被改變的量n例如:12、-6.7、al符號常量 (symbolic constants)n用一個標識符代表的常量n相當(dāng)于把標識符用一個常量簡單替換下來n標識符是一個整體,不要試圖拆開來替換n含義清楚,一改全改n習(xí)慣上符號常量名用大寫字母常量示例#define price 30#define num 12void main() . . total = num * price; total2 = 84 * price2; printf(total=%d, total); . .不會被替

4、換= total = 12 * 30;常量符號常量變量 (variables)l其值可以改變的量稱為變量l變量有一個名字,即標識符l變量在存儲器中占據(jù)一定的存儲單元l變量占據(jù)存儲空間的大小由其類型決定l變量名表示存儲變量的存儲單元地址l程序使用變量名表示這個變量所占據(jù)的存儲單元里存儲的數(shù)據(jù)的值l變量要“先定義,后使用”變量的存儲34a變量名存儲單元(地址)變量值整型 (integer)l整型常量的表示方法l整型變量n整型數(shù)據(jù)在內(nèi)存中的存放形式n整型變量的類型n整型變量的定義n整型數(shù)據(jù)的溢出l整型常量的類型整型常量的表示方法l十進制 (decimal)n例如,123、-456、0l八進制 (oc

5、tal)n以0開頭,不得含有8或9n例如,0123、-0456n錯例,0138、-0912l十六進制 (hexadecimal)n以0 x或0x開頭,用af或af表示1015n例如,0 x123、-0x45、0 x3ab、-0 xabc整型數(shù)據(jù)在內(nèi)存中的存放方式l二進制形式n舉例,int i=50; /*int類型占2字節(jié)*/l補碼 (complement)n正數(shù):與原碼一致,首位為0n負數(shù):絕對值取反加一,首位為1n零:各位全為00 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0高地址字節(jié)低地址字節(jié)補碼舉例l舉例nint i=-50; /*int類型占2字節(jié)*/0 0 0 0 0

6、 0 0 0 0 0 1 1 0 0 1 01 1 1 1 1 1 1 1 1 1 0 0 1 1 0 11 1 1 1 1 1 1 1 1 1 0 0 1 1 1 050的原碼-50的補碼取反加一整型變量的分類l按占用存儲空間的大小劃分n基本整型intn短整型short intn長整型long intl按有無符號劃分n有符號signedn無符號unsignedl上述兩種分類方式組合,可得到6種類型整數(shù)的長度l整數(shù)的類型與長度nshort:占2字節(jié)(16bit)nlong: 占4字節(jié)(32bit)nint: 占2或4字節(jié)(16或32bit)n2bytes = short int long =

7、4bytesn若需要精確的長度,可選用short或longl舉例nbc3.1:int長度為2bytesngcc:int長度為4bytes有符號數(shù)與無符號數(shù)l有符號數(shù)n二進制補碼表示,首位為符號位n指定signed或缺省情況,即為有符號數(shù)l無符號數(shù)n沒有符號位,只能表示非負數(shù)n無符號數(shù)類型必須指定為unsignedn若把負數(shù)賦值給無符號數(shù),則把該負數(shù)的補碼當(dāng)作無符號數(shù)進行處理有符號數(shù)與無符號數(shù)舉例void main() int i; unsigned j; i=j=-50; i=i/2; /*-25*/ j=j/2; /*32743*/1 1 1 1 1 1 1 1 1 1 0 0 1 1 1

8、0-50的補碼i,j/ 21 1 1 1 1 1 1 1 1 1 1 0 0 1 1 10 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1i/2-25的補碼j/232743的補碼/原碼整型數(shù)據(jù)的取值范圍類 型signed short intunsigned short intsigned intunsigned intsigned long intunsigned long int長度 (bit)161616 or 3216 or 323232取值范圍-215 215-10 216-1-215(31) 215(31)-10 216(32)-1-231 231-10 232-1整型變

9、量的定義 (definition)l定義形式nint a, b;nunsigned c;nlong d;nunsigned short e;l變量的定義一般放在一個函數(shù)開頭的聲明部分,關(guān)于變量定義的具體內(nèi)容在以后相關(guān)章節(jié)里詳細介紹整型變量的定義與使用舉例void main() int a;/*定義有符號基本整型變量a*/ unsigned b;/*定義無符號基本整型變量b*/ long c;/*定義有符號長整型變量c*/ a = -23;/*a的值為-23*/ b = 45;/*b的值為45*/ c = a + b; /*c的值為22*/整型數(shù)據(jù)的溢出 (overflow)l溢出n數(shù)據(jù)超出了變

10、量能夠存儲的范圍,造成數(shù)據(jù)丟失或數(shù)值改變等l舉例void main() int a = 32767; a+; /*32768?*/0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0+132767的補碼-32768的補碼整型常量的類型l常量的類型后綴 (suffix)nl、l表示常量是一個長整型nu、u表示常量是一個無符號整型數(shù)n兩種后綴可以一起使用l舉例n123l 長整型常數(shù)123n456u 無符號整型常數(shù)456n789ul無符號長整型常數(shù)789n101lu無符號長整型常數(shù)101整型常量使用中的類型問題l對整型變量賦值n

11、常量的值不要超過變量的取值范圍l直接使用常量n帶有l(wèi)、l、u、u等后綴的整型常量一般用于函數(shù)調(diào)用n不帶有后綴的整型常量的類型,是根據(jù)其數(shù)值大小所處的范圍來確定的浮點型 (floating point)l浮點型常量的表示方法l浮點型變量n浮點型數(shù)據(jù)在內(nèi)存中的存放形式n浮點型變量的類型n浮點型數(shù)據(jù)的舍入誤差l浮點型常數(shù)的類型浮點型常量的表示方法l十進制小數(shù)形式n由符號、數(shù)字和小數(shù)點(必須)組成n整數(shù)和小數(shù)部分都可省略,但不能同時省略n舉例,12.3、-.123、123.、0.、.0l指數(shù)形式n由整數(shù)(或小數(shù))、e(或e)、整數(shù)順序組成ne或e之前必須有數(shù)字,之后必須是整數(shù)n舉例,123.4e-5表

12、示123.410-5n錯例,e1、12e、1.2e3.4、.e5、e規(guī)范化指數(shù)形式l規(guī)范化指數(shù)形式n類似于“科學(xué)計數(shù)法”ne或e之前的小數(shù)中,小數(shù)點前面有且僅有一個非零數(shù)字l舉例,123.456n規(guī)范化形式,1.23456e2、1.23456e+002n非規(guī)范化形式,123.456、12.3456e1、12345.6e-2、0.123456e3、12345600e-5浮點型數(shù)據(jù)在內(nèi)存中的存放方式l二進制規(guī)范化指數(shù)形式l小數(shù)部分長度與能表示的精度有關(guān)l指數(shù)部分長度與能表示的數(shù)值范圍有關(guān)1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 0指數(shù)部分e小數(shù)部分f符號sesfv2). 1 ()

13、 1(幾個特殊的數(shù)l無窮大 (infinition)ninf舉例,1.0/0.0n-inf 舉例,-1.0/0.0lnan (not a number)nnan舉例,sqrt(-1) /*開平方*/n-nan 舉例,-sqrt(-1)l零 (zero)n浮點數(shù)用特殊的形式表示零浮點型變量的類型l分類n單精度 floatn雙精度 doublen長雙精度 long doublel長度和取值范圍類 型floatdoublelong double長度 (bit)3264128有效數(shù)字6715161819絕對值范圍10-37103810-3071030810-4931104932浮點型數(shù)據(jù)的舍入誤差l由

14、于浮點型變量能夠表示的有效數(shù)字有限,將有效位以外的數(shù)字舍去造成誤差l舉例float a=123456.789e5, b;b = a + 20; /*b=12345678920?*/printf(a=%fnb=%fn, a, b);運行結(jié)果 a=12345678848.000000 b=12345678848.000000n思考:1.0/3*3=?浮點型常量的類型l類型后綴nf、f表示常量是一個單精度型浮點數(shù)nl、l表示常量是一個長雙精度型浮點數(shù)n無任何后綴的浮點型常量視作雙精度型l對浮點型變量賦值n一個浮點型常量可以賦值給任何類型的浮點型變量n根據(jù)變量類型截取常量的相應(yīng)有效數(shù)字n注意防止出現(xiàn)溢

15、出字符型 (character)l字符型常量l字符型變量l字符型數(shù)據(jù)在內(nèi)存中的存放形式l字符型數(shù)據(jù)的使用方法l字符串常量字符型常量l單引號括起來的一個字符n舉例,a、a、1、 、?n錯例,abc、我l轉(zhuǎn)義字符n以開頭的特殊字符nddd 1到3位8進制數(shù)ascii碼代表的字符nxhh 1到2位16進制數(shù)ascii碼代表的字符n舉例,n、t、123、x3a字符型變量l字符型變量只能存放一個字符l定義與使用void main() char c1, c2; /*定義字符型變量c1和c2*/ c1 = a; /*c1的值為a*/ c2 = 2; /*c2的值為2*/字符型數(shù)據(jù)在內(nèi)存中的存放形式l一個字符

16、型數(shù)據(jù)占一個字節(jié)的空間l字符型數(shù)據(jù)以其ascii碼形式存放l字符型數(shù)據(jù)的存放形式與只占一個字節(jié)長度的整型數(shù)據(jù)完全相同01100001c1=a(ascii=97)00110010c1=2(ascii=50)字符型數(shù)據(jù)的使用方法l可以把字符型數(shù)據(jù)視作一種長度為1字節(jié)的整型數(shù)據(jù)處理n當(dāng)使用字符型數(shù)據(jù)時,與使用這個字符的ascii碼(一個8位整數(shù))是完全一樣的n字符型數(shù)據(jù)的用法與整型數(shù)據(jù)完全一樣,包括運算、賦值、輸入、輸出等n字符型數(shù)據(jù)使用過程中,同樣需要注意溢出、符號等問題l是字符還是整數(shù),只有在輸出時才有意義字符型數(shù)據(jù)使用舉例void main() char c; int i, j; c = 97

17、;/*c = a*/ i = c + 20;/*i = 117*/ j = 2;/*j = 50*/ printf(%c, %dn, c, c); /*a, 97*/字符型變量的符號l字符型變量與整型變量一樣,也分為有符號數(shù)與無符號數(shù)l無符號字符nunsigned char c;n舉例,表示一個班級的人數(shù) ( = = !=l邏輯運算符! & |l位運算符 | &l賦值運算符= += -= *= /= %= l下標運算符l其他運算符()運算符的優(yōu)先級 (precedence)l優(yōu)先級n運算符的運算次序按優(yōu)先級由高到低執(zhí)行n可以用圓括號( )改變運算符的執(zhí)行次序l舉例na+b*cd

18、/e/*先算乘除,后算加減*/*乘除比加減優(yōu)先級高*/n(a+b)*(c-d)/e/*先算加減,后算乘除*/運算符的結(jié)合方向 (associativity)l結(jié)合方向n當(dāng)一個操作數(shù)兩側(cè)的運算符優(yōu)先級相同時,運算次序按照結(jié)合方向的規(guī)定進行l(wèi)舉例na+b-c/*+和-的結(jié)合方向都是從左向右*/*b先與+結(jié)合計算a+b,然后執(zhí)行減法*/na=b=1/*=的結(jié)合方向是從右向左,先計算b=1*/運算符的結(jié)合方向規(guī)則l單目運算符的結(jié)合方向都是“從右向左”n!、+、-、+(正號)、-(負號)n*(指針運算符)、&(地址運算符)nsizeof、(type)l賦值運算符的結(jié)合方向是“從右向左”l三目運算

19、符的結(jié)合方向是“從右向左”n唯一的三目運算符:條件運算符?:l其他運算符的結(jié)合方向都是“從左向右”優(yōu)先級與結(jié)合方向總結(jié)l不同優(yōu)先級的運算符,運算次序按優(yōu)先級由高到低執(zhí)行l(wèi)同一優(yōu)先級的運算符,運算次序按結(jié)合方向的規(guī)定執(zhí)行l(wèi)可以使用圓括號( )明確運算次序n圓括號()具有最高的優(yōu)先級表達式 (expression)l表達式的概念l表達式的類型l表達式求值n算術(shù)運算符和算術(shù)表達式n賦值運算符和賦值表達式n逗號運算符和逗號表達式表達式的概念l表達式n用運算符把操作數(shù)連接起來,并符合c語言語法規(guī)則的式子n操作數(shù)包括常量、變量、函數(shù)調(diào)用、表達式n廣義上,常量、變量、函數(shù)調(diào)用也可以看作屬于表達式的范疇l舉例

20、na+2.5*b-6/c+z-max(x,y)n!(a1e-6)&(b=(c+sqrt(f)表達式的類型l表達式的類型n表達式的值的類型n取決于操作數(shù)的類型以及它們所做的運算l舉例na+2.5*b-6/c+z/*混合類型算術(shù)運算,值為double類型*/n!(a 5 */b=(int)(x+y);/* b=6, (int)(6.5) */c=(int)x;printf(x=%f, c=%dn, x, c);/* x=2.800000, c=2 */z=(float)d/e;/* z=2.5 */自增、自減運算符l形式n+i, -i使用i之前,先使i的值加/減1ni+, i-使用i之后,

21、再使i的值加/減1l說明n+i和-i的值是加/減1之后i的值ni+和i-的值是加/減1之前i的值n+和-只能用于變量,不能用于常量和表達式n+和-的結(jié)合方向是“自右向左”自增、自減運算符舉例int i=3, j, a, b=1, c=2;j = +i;/* i=i+1, j=i, i=4, j=4 */j = i+;/* j=i, i=i+1, i=5, j=4 */j = -i+;/* -(i+), i=6, j=-5 */j = i+*2;/* (i+)*2, i=7, j=12 */a = (b+c)+;/* 非法! */a = 34+;/* 非法! */j = +i+;/* 非法! *

22、/有關(guān)表達式使用的問題l表達式中子表達式的求值順序沒有規(guī)定ni=3; j=(i+)+(i+)+(i+);/* j=9? 12? */lc編譯程序自左向右盡可能多的將若干字符組合成一個運算符、標識符、關(guān)鍵字ni+j /* (i+)+j? i+(+j)? */l調(diào)用函數(shù)時,實參的求值順序沒有規(guī)定ni=3; printf(%d,%dn, i, i+);/* 3,3? 4,3? */賦值運算符 (assignment operators)l賦值運算符 =n把右側(cè)表達式的值賦給左側(cè)的變量n一般情況下,賦值運算符左側(cè)只能是變量n賦值運算符的優(yōu)先級較低,“自右向左”結(jié)合n運算符兩側(cè)類型不一致時,要進行類型轉(zhuǎn)

23、換n注意“賦值”與“等于”的區(qū)別,例如i=i+2;l復(fù)合賦值運算符n=前加上算術(shù)運算符或位運算符,如+=、|=n舉例,z*=x+y;/* z=z*(x+y); */賦值表達式l賦值表達式nn賦值表達式的值就是所賦的值n運算符右側(cè)的表達式可以是一個賦值表達式l舉例na=5; /*表達式的值為5*/na=b=3; /*a=(b=3)*/na=b=c=1; /*a=(b=(c=1)*/na=(b=4)+(c=3);/*b=4, c=3, a=7*/逗號運算符l逗號運算符 ,nexp1, exp2n逗號運算符的優(yōu)先級最低,“自左向右”結(jié)合n逗號表達式的值是exp2的值nexp1和exp2都可以又是“逗

24、號表達式”n把多個表達式組合成一個表達式使用l舉例nx=(a=3, 6*a) /* a=3, x=18 */nx=a=3, 6*a /* a=3, x=3 */基本輸入輸出l頭文件n#include l輸入輸出函數(shù)n字符輸出函數(shù)putcharn字符輸入函數(shù)getcharn格式輸出函數(shù)printfn格式輸入函數(shù)scanfn字符串輸出函數(shù)putsn字符串輸入函數(shù)gets字符輸出函數(shù)putcharl函數(shù)說明nint putchar(int c);n輸出一個字符到標準輸出設(shè)備l參數(shù)說明nint c 要輸出的字符,可以是整數(shù)或字符,若超出字符型范圍,則只使用低字節(jié)l返回值n若成功,返回輸出字符的asci

25、i碼值n若失敗,返回eof (end of file)函數(shù)putchar舉例 int c, i;putchar(a);/* 輸出a */putchar(n);/* 輸出換行符 */putchar(101);/* 輸出e */putchar(101);/* 輸出a */c = 1000;i = putchar(c);/* 輸出,i=232 */字符輸入函數(shù)getcharl函數(shù)說明nint getchar(void);n從標準輸入設(shè)備輸入一個字符n需要輸入回車后,函數(shù)才返回l參數(shù)說明n無參數(shù)l返回值n若成功,返回輸入字符的ascii碼值n若失敗,返回eof (end of file)函數(shù)getch

26、ar舉例 int c;c = getchar();/* 輸入a后回車 */putchar(c);/* 輸出a */c = getchar();/* 是否需要輸入? */printf(c=%dn, c);/* 輸出c=? 10 */c = getchar();/* 輸入abcd后回車 */putchar(c);/* 輸出a */putchar(getchar(); /* 輸出b */格式輸出函數(shù)printfl函數(shù)說明nint printf(char* format, args.);n格式化輸出若干任意類型數(shù)據(jù)l參數(shù)說明nchar* format 格式控制字符串nargs 需要輸出的數(shù)據(jù)列表,可以

27、多個或沒有l(wèi)返回值n若成功,返回輸出的字節(jié)數(shù),包括換行符n若失敗,返回eof (end of file)函數(shù)printf的參數(shù)說明l格式字符串n包括“格式說明”和“普通字符”n“格式說明”由%和“格式字符”組成,將輸出數(shù)據(jù)按指定格式輸出n“普通字符”按原樣輸出l輸出列表n需要輸出的數(shù)據(jù)n可以是變量、常量、表達式、函數(shù)調(diào)用等n輸出數(shù)據(jù)按順序與“格式說明”對應(yīng)輸出函數(shù)printf的格式舉例printf(a=%d b=%d, a, b);格式說明普通字符輸出列表輸出結(jié)果a=3 b=4格式字符格式字符d, iox, xucsfe, eg, g%說 明有符號十進制整數(shù),正數(shù)不輸出符號無符號八進制整數(shù),不

28、輸出前導(dǎo)0無符號十六進制整數(shù),不輸出前導(dǎo)0 x或0x無符號十進制整數(shù)轉(zhuǎn)換為無符號字符型,以此為ascii碼輸出一個字符輸出字符串,直到遇到0或達到指定寬度小數(shù)形式單、雙精度數(shù),缺省精度為6位小數(shù)以規(guī)范化指數(shù)形式輸出浮點數(shù),缺省精度為6位小數(shù)以f(f)和e(e)兩種格式中較短的一種輸出輸出一個%附加格式字符格式字符hllmn -+0 #說 明有符號或無符號短整型有符號或無符號長整型長雙精度型一個正整數(shù),輸出數(shù)據(jù)的最小寬度一個正整數(shù),輸出的小數(shù)位數(shù)或字符串截取個數(shù)分隔m和n輸出的數(shù)字或字符向左靠齊輸出的數(shù)字一直帶符號,即正號也輸出輸出的數(shù)字不滿規(guī)定寬度時,用前導(dǎo)0填充有符號數(shù)字如果沒有輸出符號,則

29、前面加一個空格八進制和十六進制數(shù)加前綴,浮點數(shù)格式也有所改變函數(shù)printf舉例 int i=1234; float f=-56.78;printf(i=%+6d, i);/* i= +1234 */printf(%c, i);/* */printf(%#08x, i); /* 0 x0004d2 */printf(%10.5e, f);/* -5.67800e+01 */printf(%7.4f%, f);/* -56.7800% */printf(%+6.3g, f);/* -56.8 */printf(%-6.3s, hello); /* hel */格式輸入函數(shù)scanfl函數(shù)說明nint scanf(char* format, addrs.);n格式化輸入若干任意類型數(shù)據(jù)l參數(shù)說明nchar* format 格式控制字符串naddrs 需要輸入的地址列表,可以有多個l返回值n返回輸入并賦值的數(shù)據(jù)項的個數(shù)函數(shù)scanf使用說明l“地址列表”中是變

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論