C++語言程序設(shè)計(jì):第2章 數(shù)據(jù)類型、運(yùn)算符和表達(dá)式_第1頁
C++語言程序設(shè)計(jì):第2章 數(shù)據(jù)類型、運(yùn)算符和表達(dá)式_第2頁
C++語言程序設(shè)計(jì):第2章 數(shù)據(jù)類型、運(yùn)算符和表達(dá)式_第3頁
C++語言程序設(shè)計(jì):第2章 數(shù)據(jù)類型、運(yùn)算符和表達(dá)式_第4頁
C++語言程序設(shè)計(jì):第2章 數(shù)據(jù)類型、運(yùn)算符和表達(dá)式_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、P1第2章 數(shù)據(jù)類型、運(yùn)算符和表達(dá)式2.1 數(shù)據(jù)類型2.2 常量和變量2.3 運(yùn)算符和表達(dá)式2.4 位運(yùn)算2.5 運(yùn)算符的優(yōu)先級(jí)2.6 格式化輸入輸出函數(shù)的進(jìn)一步討論2.7 常見問題分析P22.1 數(shù)據(jù)類型在C+語言中,數(shù)據(jù)類型可分為 :C/C+沒有字符串類型,用字符數(shù)組表示字符串2P32.2 常量和變量2.2.1 常量(準(zhǔn)確的稱作文字量/字面量)1.整型文字量:即整常數(shù)65535;0177777(65535) 10;0XFFFF=(65535) 10; 整型文字量的后綴(L/、H/h):長整型數(shù)加后綴“L”或“l(fā)” 。如:12345678902.浮點(diǎn)型文字量 :也稱為實(shí)型3.14 、 .0、

2、0.、1.23e-4、.234e+12 十進(jìn)制格式八進(jìn)制格式 十六進(jìn)制格式后綴的作用P43. 字符型文字量:用單引號(hào)括起來的一個(gè)字符 。如:a 、C、 =、 +、 ?字符文字量的值:ASCII碼值(對(duì)應(yīng)一個(gè)整數(shù))。 轉(zhuǎn)義字符: 以反斜線.開頭的特殊表示方式。如:a,n,x30用途:可以表示所有符號(hào),如: 101和x41表示字母A ,n表示回車操作。 4. 字符串文字量:由一對(duì)雙引號(hào)括起的字符序列。如:“C+”串的特點(diǎn):每個(gè)串文字量均在最后隱藏了0(字符串結(jié)束的標(biāo)志)(稱作: NULL符,空字符,vs. 空格字符)A = = 65字母A的多種表示方法字母A的多種表示方法字母A的多種表示方法2P5

3、常用的轉(zhuǎn)義字符如下表所示: 轉(zhuǎn)義字符轉(zhuǎn)義字符的意義ASCII代碼 n回車換行 10 t橫向跳到下一制表位置 9 b退格 8 r回車 13 f走紙換頁 12 反斜線符() 92 單引號(hào)符() 39 “ 雙引號(hào)符(“) 34 a鳴鈴 7 0空字符(=NULL) ddd13位八進(jìn)制數(shù)所代表的字符 xhh12位十六進(jìn)制數(shù)所代表的字符b含義不同于b。注意: ,0常用注意: ,0常用P65. 符號(hào)常量 (宏):用途:含義清楚;能做到“一改全改”。 符號(hào)常量在使用之前必須先定義,其一般形式為: #define 符號(hào)常量標(biāo)識(shí)符 值如:#define PI 3.14/C 的常量形式,無類型C+的常量:const

4、 double PI 3.14; /C+,有類型預(yù)處理命令#define宏替換不是語句,無分號(hào)“;”C+ const量2P7例2.2 采用宏定義的方式定義符號(hào)常量#include #define PI 3.14159 /定義符號(hào)常量PI,值為3.14159void main( ) double radius = 10.0; double perimeter; double area; perimeter = 2 * PI * radius; /使用符號(hào)常量 area = PI * radius *radius; /使用符號(hào)常量 printf(radius=%lf,perimeter=%lf,a

5、rea=%6.2lfn, radius,perimeter,area);輸出結(jié)果為:radius=10.000000,perimeter=62.831800,area=314.16%.0f10const double PI=3.14159; /C+中用有類型的const常量替代C的宏2P82.2.2 變量在程序執(zhí)行過程中,值可以改變的量稱為變量。變量要先定義再使用變量定義格式為: 存儲(chǔ)類型 數(shù)據(jù)類型 變量名列表 = 初值; 例:auto int a,b,c; float f, g=3.0;另外,一些約定俗成的規(guī)則:盡量見名知意。用戶最好不要用下劃線來作為變量名的開頭。 符號(hào)常量(宏)用大寫字母

6、,變量標(biāo)識(shí)符可大小寫結(jié)合。變量定義的目的:通知編譯器在哪一塊內(nèi)存區(qū)分配多少字節(jié)內(nèi)存單元給變量變量要先定義再使用變量名的大小寫敏感case-sensitiveauto自動(dòng)存儲(chǔ)類型2P91整型變量 在C+語言中,整型用int表示。根據(jù)整型數(shù)在存儲(chǔ)器中占用的字節(jié)數(shù),又可細(xì)分:short unsigned shortintunsigned longunsigned long 占內(nèi)存字節(jié)數(shù)滿足: unsigned short =unsigned int= unsigned long short = int = long 2.浮點(diǎn)型變量 float 單精度型4字節(jié) double 雙精度型8字節(jié) long

7、double 長雙精度型10字節(jié)3. 字符變量char unsigned char 字符變量就是一個(gè)字節(jié)的整型變量,二者兼容char ch=a ;可寫成char ch=97;int i=97;可寫成int i=a;2字節(jié):BC34字節(jié):VC6P102.3 運(yùn)算符和表達(dá)式2.3.1 表達(dá)式2.3.2 算術(shù)運(yùn)算符與算術(shù)表達(dá)式2.3.3 關(guān)系運(yùn)算符與關(guān)系表達(dá)式2.3.4 邏輯運(yùn)算符與邏輯表達(dá)式2.3.5 自增和自減運(yùn)算 2.3.6 賦值運(yùn)算符與賦值表達(dá)式2.3.7 條件運(yùn)算符與條件表達(dá)式2.3.8 逗號(hào)運(yùn)算符與逗號(hào)表達(dá)式P11“運(yùn)算符”就是記述各種不同運(yùn)算過程的符號(hào)。按運(yùn)算對(duì)象的數(shù)目: 單目、雙目和

8、三目運(yùn)算符;按照其功能: 算術(shù)、賦值、關(guān)系、邏輯、位運(yùn)算符、+/- 條件運(yùn)算、逗號(hào)等運(yùn)算符2.3.1 表達(dá)式表達(dá)式是由運(yùn)算符和運(yùn)算量所組成運(yùn)算量可以是變量、常量、有返回值的函數(shù)調(diào)用等。變量常量有返回值的函數(shù)調(diào)用P122.3.2 算術(shù)運(yùn)算符與算術(shù)表達(dá)式C+語言中,算術(shù)運(yùn)算符有5個(gè),它們的具體含義見下表 :運(yùn)算符使用形式含義 +單目或雙目運(yùn)算符單目運(yùn)算表示正號(hào),雙目運(yùn)算表示加法運(yùn)算 -單目或雙目運(yùn)算符單目運(yùn)算表示求負(fù),雙目運(yùn)算表示減法運(yùn)算 *雙目運(yùn)算符乘法運(yùn)算 /雙目運(yùn)算符除法運(yùn)算 %雙目運(yùn)算符取模運(yùn)算(求余數(shù))P13關(guān)于算術(shù)運(yùn)算符的使用有以下規(guī)則:+、-、*、/運(yùn)算符的運(yùn)算量可為任何整型、字符型

9、或浮點(diǎn)型的量 在x/y中,運(yùn)算量y的取值不能為0。(3) %運(yùn)算符要求運(yùn)算量必須是整型,且%后面的運(yùn)算量不能為0。例如:3 % 5 結(jié)果為3-17 % 5 結(jié)果為-220 % 10 結(jié)果為0P14(4) 當(dāng)雙目運(yùn)算符的兩個(gè)運(yùn)算量的類型相同時(shí),它們的運(yùn)算結(jié)果的類型與運(yùn)算量類型相同。例如:17.5 + 2.5 結(jié)果為浮點(diǎn)型20.016 / 7 結(jié)果為整型2,小數(shù)部分被省去,稱為整除(5) 兩個(gè)運(yùn)算量的類型不同時(shí),運(yùn)算前遵循類型的一般轉(zhuǎn)換規(guī)則將運(yùn)算量自動(dòng)轉(zhuǎn)換成相同的類型,運(yùn)算結(jié)果的類型與轉(zhuǎn)換后的運(yùn)算量的類型相同【例】: 15.5 + 5 操作數(shù)15.5的類型為實(shí)型,運(yùn)算前將整型數(shù)5轉(zhuǎn)換成實(shí)型數(shù)5.0

10、,然后進(jìn)行運(yùn)算,結(jié)果為20.5【例】:16 / 5.0 結(jié)果為浮點(diǎn)型3.2 ,此為精確除2P15【說明】:在數(shù)學(xué)中恒等的表達(dá)式,在C+語言表達(dá)式中不一定恒等,如: 6/4*56*5/ 4。建議:在“/”運(yùn)算符兩邊采用float、double數(shù)據(jù)(精確除) 下面的表達(dá)式隱含了危險(xiǎn),因?yàn)楸?除: 18/(3/6) 18/((double)3/6) 或者:“/”兩邊的整數(shù)有一個(gè)在數(shù)尾加小數(shù)點(diǎn),如:18/(3./6)為了減少計(jì)算誤差,常把乘法運(yùn)算放在除法運(yùn)算前面完成P16 在C+語言中,字符型、整型和浮點(diǎn)型數(shù)據(jù)可以在同一表達(dá)式中混合使用,C+語言編譯系統(tǒng)通過類型轉(zhuǎn)換實(shí)現(xiàn)類型統(tǒng)一。自動(dòng)類型轉(zhuǎn)換應(yīng)用的三種

11、場(chǎng)合:當(dāng)雙目運(yùn)算符的兩個(gè)運(yùn)算量的類型不相同且進(jìn)行算術(shù)運(yùn)算時(shí);(2) 當(dāng)一個(gè)值賦予一個(gè)不同類型的變量時(shí);(3) 函數(shù)調(diào)用,實(shí)參與形參類型不同時(shí)。在本節(jié)中僅介紹前兩種轉(zhuǎn)換,函數(shù)調(diào)用轉(zhuǎn)換將在本書的后面部分介紹。 2P171.算術(shù)運(yùn)算時(shí)的自動(dòng)類型轉(zhuǎn)換 它的基本規(guī)則可描述為:雙目運(yùn)算符的兩個(gè)運(yùn)算量中,值域較窄的類型向值域較寬的類型轉(zhuǎn)換?!爸涤颉本褪穷愋退鼙硎镜闹档淖畲蠓秶?。算術(shù)轉(zhuǎn)換遵循的轉(zhuǎn)換方向如下圖所示:2P18下面兩點(diǎn)為必然轉(zhuǎn)換:表達(dá)式中的有符號(hào)和無符號(hào)字符以及短整型一律被轉(zhuǎn)換為整型int類型(2) 當(dāng)算術(shù)運(yùn)算中出現(xiàn)float類型時(shí),首先將float轉(zhuǎn)成double類型。double ss = f

12、 * n + k / 2; float f = 3.6;int n = 6;long k = 21;doubleintdoubledoubledoublelonglongdouble*、/、%優(yōu)先級(jí)相同+、-優(yōu)先級(jí)相同前者優(yōu)先于后者3P192. 賦值運(yùn)算時(shí)的自動(dòng)類型轉(zhuǎn)換賦值運(yùn)算格式: 左值變量 = 右值表達(dá)式賦值轉(zhuǎn)換將右值表達(dá)式結(jié)果的類型轉(zhuǎn)成左值表達(dá)式的數(shù)據(jù)類型,再將轉(zhuǎn)換后的結(jié)果寫入左值變量的內(nèi)存空間中;它不受算術(shù)轉(zhuǎn)換規(guī)則的約束,轉(zhuǎn)換結(jié)果的類型完全由左值變量的類型決定。例如:int i,j;float m;i = (m * j);類型轉(zhuǎn)換過程為:賦值運(yùn)算符右側(cè)的表達(dá)式的值類型為double,經(jīng)

13、過賦值轉(zhuǎn)換變成int類型。其值也跟著改變以適應(yīng)新類型。注意:表達(dá)式的值與其類型匹配,故值受限于類型;右值表達(dá)式類型轉(zhuǎn)換后,其結(jié)果也跟著變換。2P203 . 強(qiáng)制類型轉(zhuǎn)換(顯式) 強(qiáng)制類型轉(zhuǎn)換是用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符來實(shí)現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換的,因此強(qiáng)制類型轉(zhuǎn)換也叫做顯式轉(zhuǎn)換 。 強(qiáng)制類型轉(zhuǎn)換表達(dá)式形式為: (新類型) (表達(dá)式A)作用是將表達(dá)式A的值參與運(yùn)算得到運(yùn)算值,運(yùn)算值類型為新類型。整體也是表達(dá)式,類型為新類型,值為轉(zhuǎn)換后的值2P21例如:float m,n(int)m 取出m的值參與(int)運(yùn)算,得到中間結(jié)果值,該值的類型為int類型。注意:變量m本身類型和值都不變(int)m+n 表達(dá)式的結(jié)

14、果為double類型 需要注意的是,無論是自動(dòng)類型轉(zhuǎn)換還是強(qiáng)制類型轉(zhuǎn)換,都只是看作運(yùn)算符而已。參與運(yùn)算的變量或常量的類型和值都不改變,改變的就是運(yùn)算后的中間結(jié)果。 2P22 C語言中的關(guān)系運(yùn)算符包括: (小于) =(大于或等于) (大于) != (不等于) 2.3.3 關(guān)系運(yùn)算符與關(guān)系表達(dá)式關(guān)系表達(dá)式格式: 運(yùn)算量 關(guān)系運(yùn)算符 運(yùn)算量運(yùn)算量可以是任意表達(dá)式關(guān)系成立:值為整數(shù)1關(guān)系不成立:值為整數(shù)0P23 優(yōu)先級(jí) 、 = = 、 ! = 關(guān)系運(yùn)算符與算術(shù)運(yùn)算符和賦值運(yùn)算符比較優(yōu)先級(jí)算術(shù)運(yùn)算符關(guān)系運(yùn)算符高低高低關(guān)系運(yùn)算符的結(jié)合性左結(jié)合性 【例】 a=3,b=2,c=1;求:a b c 的值 第一步

15、:32關(guān)系成立,結(jié)果為1;第二步:11關(guān)系不成立,結(jié)果為0。同優(yōu)先級(jí)時(shí)考慮結(jié)合性2P24C語言中的邏輯運(yùn)算符包括: &(邏輯與) | (邏輯或) ! (邏輯非)其中,邏輯與和邏輯或是雙目運(yùn)算符,邏輯非是單目運(yùn)算符。邏輯運(yùn)算符及運(yùn)算量按一定規(guī)則所構(gòu)成的表達(dá)式稱為邏輯表達(dá)式。 2.3.4 邏輯運(yùn)算符與邏輯表達(dá)式P25C+的語法將參與邏輯運(yùn)算的兩個(gè)運(yùn)算分量解釋為邏輯量,但通常邏輯運(yùn)算符兩邊的運(yùn)算分量可以是普通表達(dá)式。因此,就需先將這些表達(dá)式的結(jié)果數(shù)值轉(zhuǎn)換為邏輯值“真”或“假”,再來進(jìn)行邏輯運(yùn)算。 邏輯運(yùn)算分量對(duì)應(yīng)的表達(dá)式轉(zhuǎn)換為邏輯量的規(guī)則:若運(yùn)算分量的值為非0的任意數(shù),則為邏輯“真”;若運(yùn)算分量的值

16、為0,則為邏輯“假”;邏輯運(yùn)算的結(jié)果為整數(shù)值0或1: 邏輯“真”結(jié)果用1表示 邏輯“假”結(jié)果用0表示P26邏輯運(yùn)算符的運(yùn)算規(guī)則見下表 : 表達(dá)式X表達(dá)式Y(jié) !X !Y X&Y X|Y非0非0 0 0 11非00 0 1 01 0 非0 1 0 0100 1 1 00P27高低算術(shù)運(yùn)算符關(guān)系運(yùn)算符賦值運(yùn)算符&|! + - -邏輯運(yùn)算符的結(jié)合性:!右結(jié)合性&、|左結(jié)合性邏輯運(yùn)算符與其它運(yùn)算符比較優(yōu)先級(jí):優(yōu)先級(jí)和結(jié)合性 ! & |高 低P28例2.6 邏輯運(yùn)算符&的使用#include int main( ) int a , b , c , max; a = 10; b = 20; max = b;

17、 c = ( a b ) & ( max = a ) ; printf(a = %d , b = %d , c = %d , max = %dn,a,b,c,max); return 0; 運(yùn)行結(jié)果為:a = 10 , b = 20 , c = 0 , max = 20 換成“=”,結(jié)果如何?a = 10 , b = 20 , c = 1 , max = 10=2P29 在數(shù)學(xué)中經(jīng)常有右邊的表達(dá)式:1=x=1 & x=9直接寫成1=x=9,結(jié)果如何?對(duì)C/C+來說是符合語法的,因?yàn)樗且粋€(gè)關(guān)系表達(dá)式,按左結(jié)合求解1=x,若x取值滿足條件則表達(dá)式結(jié)果為1,然后19時(shí)前面的關(guān)系表達(dá)式結(jié)果也為 “真

18、”。顯然,這種書寫方式不能起到對(duì)應(yīng)的條件限制作用。2P30例: 判斷某個(gè)字符型變量c 的值是否數(shù)字字符,正確的寫法:if (c=0 & c=9) 若寫成:if ( 0=c= 0 & c= 9 0和0的區(qū)別整數(shù)和字符的區(qū)別P31【經(jīng)典示例】 d !=0 & n /d 0 (假設(shè)初始值:d=0)由于d !=0 關(guān)系不成立,邏輯量為“假”,因?yàn)檫壿嫛芭c”運(yùn)算等效于乘法,即只要兩個(gè)運(yùn)算分量中有一個(gè)為邏輯“假” ,則整個(gè)邏輯“與”運(yùn)算就為“假”。 故而,本例中n/d -(a+)2.3.5 自增和自減運(yùn)算P33前置運(yùn)算:先變后用;用新值參與計(jì)算例如:x = 0 ; y = - x + x; 結(jié)果為x=-1

19、,y=-2 (2) 后置運(yùn)算:先用后變;用舊值參與計(jì)算例如:x = 0 ; y = x- + x;結(jié)果為x = -1 , y =0;(3) 自增自減運(yùn)算符只能作用于變量,不能用于常量和表達(dá)式以及函數(shù)調(diào)用。 p()P34void main ( ) int a , b , c ; a = b = c =1 ; printf (“ (1) %d n ” , +a | | + b &+c ) ; printf (“ (2) %d t %d t %d n ” , a , b , c ) ; printf (“ (3) %d n ” , +a & + b | |+c ) ; printf (“ (4) %

20、d t %d t %d n ” , a , b , c ) ; printf (“ (5) %d n ” , a | | b | | c ) ; printf (“ (6) %d t %d t %d n ” , a , b , c ) ; printf (“ (7) %d n ” , a & b & c ) ; printf (“ (8) %d t %d t %d n ” , a , b , c ) ; printf (“ (9) %d n ” , a | | b & c ) ; printf (“ (10) %d t %d t %d n ” , a , b , c ) ;結(jié)果輸出:1211(

21、)()()1321122101100000誤區(qū):優(yōu)先級(jí)高的運(yùn)算符先運(yùn)算4P351. 基本賦值運(yùn)算“” 左值 = 右值表達(dá)式賦值表達(dá)式的值 等于表達(dá)式左值變量的值int i,jchar m,nfloat x,ydouble d2.3.6 賦值運(yùn)算符與賦值表達(dá)式i = m nm n的結(jié)果為整型,無需轉(zhuǎn)換,直接將值賦給ii = j = 10 (考慮結(jié)合性-右結(jié)合)相當(dāng)于i=(j=10),先將10賦給j,而括號(hào)中的賦值表達(dá)式(j=10)的值就是賦值后的 j 的值,再將其賦給i(考慮類型轉(zhuǎn)換)(考慮優(yōu)先級(jí))d = m2P362. 復(fù)合賦值運(yùn)算在賦值運(yùn)算符“=”前加上其他運(yùn)算符,便構(gòu)成了復(fù)合賦值運(yùn)算符。C

22、語言中的復(fù)合賦值運(yùn)算符共有10種:+=、-=、*=、/=、%=、&=、|=、=、=復(fù)合賦值表達(dá)式的形式為:左值op = 右值表達(dá)式等價(jià)于:左值=左值op右值表達(dá)式例如:i += j 等價(jià)于 i = i + jx *= y - 5 等價(jià)于 x = x * (y-5)m = 2 等價(jià)于 m = m b ) ? a : b) ; 將a , b中最大的數(shù)賦值給變量 maxmin = ( a b) ? a :(c d) ? c :d(a b) ? a :(c d)? c :d)若:a =1 , b = 2 , c = 3 , d = 4 ,則表達(dá)式值 = 4。條件表達(dá)式值的類型抉擇:xy?1:1.5,若

23、xy關(guān)系成立,則表達(dá)式結(jié)果?【規(guī)則】:表達(dá)式2和表達(dá)式3可以不同類型,此時(shí)條件表達(dá)式的值的類型為二者中較高的類型,上述表達(dá)式結(jié)果類型為 double類型2結(jié)果為1. 0P41附:在C+中有下面一條語法規(guī)則:在一個(gè)條件運(yùn)算符的表達(dá)式中,如果后面兩個(gè)表達(dá)式的值類型相同,而且均可以作為左值,則該條件運(yùn)算符的值是一個(gè)左值表達(dá)式。如: int x=5;long a , b;(x? a: b) =1;/ 注:若x為真,則a變量的值將被賦值為1(x? x: b) =2;/ x和 b 不是相同類型,條件運(yùn)算符將作自動(dòng)轉(zhuǎn)換,經(jīng)過轉(zhuǎn)換類型的表達(dá)式不能再作為左值。(x? a: 6.6) =3;/ 6.6不是左值第一

24、表達(dá)式可以為非左值的表達(dá)式,如:(x= =0?a:b) = 8;3P42逗號(hào)運(yùn)算符構(gòu)成逗號(hào)表達(dá)式,結(jié)構(gòu)為: 表達(dá)式1 , 表達(dá)式2 , 表達(dá)式3, , 表達(dá)式n 運(yùn)算過程為:先求表達(dá)式1的值,然后再求表達(dá)式2的值,依次計(jì)算下去,最后表達(dá)式n的值也就是該逗號(hào)表達(dá)式的值。例如:int b,a=10;/分隔符 b = a+ , a % 3 /逗號(hào)運(yùn)算符 (順序計(jì)算運(yùn)算符) 先求表達(dá)式1的值,結(jié)果為10,同時(shí)對(duì)a計(jì)算后綴+ ,此時(shí)a的值為11;然后求表達(dá)式2(a%3)的值,由于在計(jì)算表達(dá)式2之前,變量a的自增運(yùn)算已經(jīng)完成,因而表達(dá)式2的值為2。這樣整個(gè)逗號(hào)表達(dá)式的值為2。2.3.8 逗號(hào)運(yùn)算符與逗號(hào)表

25、達(dá)式2P43sizeof運(yùn)算符1、格式:sizeof (類型名)2、含義:求某種數(shù)據(jù)類型的變量存儲(chǔ)空間的長度(以字節(jié)為單位)。該運(yùn)算符是在編譯時(shí)執(zhí)行,而不是在程序執(zhí)行時(shí)進(jìn)行運(yùn)算。3、應(yīng)用 類型名可以是C+語言的基本數(shù)據(jù)類型或者構(gòu)造數(shù)據(jù)類型(如:數(shù)組、指針、結(jié)構(gòu)、class類型等),如: sizeof ( struct student )int array7; sizeof(int 7) sizeof ( array ) sizeof ( int ); sizeof ( int * )sizeof(類型名)sizeof(變量名)P442.4 位運(yùn)算2.4.1 按位與運(yùn)算符“&”2.4.2 按位或

26、運(yùn)算符“|”2.4.3 按位異或運(yùn)算符“” 2.4.4 二進(jìn)制左移運(yùn)算符“”2.4.6 按位取反運(yùn)算符“”P452.4.1 按位與運(yùn)算符“&”按位與運(yùn)算是對(duì)兩個(gè)操作數(shù)逐位求與,當(dāng)它們都為1時(shí),結(jié)果為1,否則為0。與運(yùn)算符的定義如下表所示: 位1 位2 位1&位2 0 0 0 0 1 0 1 0 0 1 1 1例如:int a=0 x0096,b=0 x0080,則a&b的結(jié)果為0 x0080P46運(yùn)算過程為:P472.4.2 按位或運(yùn)算符“|”按位或運(yùn)算是對(duì)兩個(gè)操作數(shù)逐位相或。當(dāng)它們都是0的時(shí)候,結(jié)果為0,否則為1。下表為位邏輯或操作的“真值表” 位1 位2 位1|位2 0 0 0 0 1 1

27、 1 0 1 1 1 1P48運(yùn)算過程為:例如:int a=0 x0036,b=0 x0055,則a | b的結(jié)果為0 x0077P492.4.3 按位異或運(yùn)算符“”按位異或運(yùn)算是將兩個(gè)操作數(shù)逐位相異或,當(dāng)它們相異則結(jié)果為1,否則為0。下表為 位邏輯異或操作的“真值表” 位1 位2 位1位2 0 0 0 0 1 1 1 0 1 1 1 0P50運(yùn)算過程為:從所得的結(jié)果看,某位要保持不變就和0異或,某位要取反就和1異或。 舉例關(guān)于兩個(gè)整型變量互相交換值3P512.4.4 二進(jìn)制左移運(yùn)算符“”二進(jìn)制左移運(yùn)算符把數(shù)據(jù)向左移動(dòng)若干位,移出左邊界的所有位都將丟失,右側(cè)移入0。例如:int a = 4 ,

28、 a ”二進(jìn)制右移運(yùn)算符把數(shù)據(jù)向右移動(dòng)若干位,移出右邊界的所有位都將丟失,左側(cè)的新位的補(bǔ)充遵循下面的規(guī)則:【例】變量a是無符號(hào)數(shù),a=8,其二進(jìn)制表示為00001000,右移1位且左側(cè)新位補(bǔ)0后結(jié)果為00000100,所以a1的結(jié)果為4.由例子可知,向右移動(dòng)一位相當(dāng)于整除以一個(gè)21。 a4的結(jié)果為0(1) 對(duì)于無符號(hào)數(shù),右移時(shí)左側(cè)的新位一律補(bǔ)0,稱為“邏輯右移”(2) 對(duì)于有符號(hào)數(shù),若符號(hào)位是0,則左側(cè)新位一律補(bǔ)0;若符號(hào)位是1,則左側(cè)新位一律補(bǔ)1,稱為“算術(shù)右移” 又叫“符號(hào)位擴(kuò)展”3P53【例】變量a是有符號(hào)數(shù),a=1,其二進(jìn)制表示為:111111111右移1位且左側(cè)新位補(bǔ)1后結(jié)果為111

29、111111,所以a1的結(jié)果為1. ?a2的結(jié)果仍為1 (unsigned)a1的結(jié)果為2147483647(vc6)或32767(BC3)?P542.4.6 按位取反運(yùn)算符“”按位取反運(yùn)算符是將操作數(shù)進(jìn)行逐位“取反”。例如:變量int a=0 x006a,二進(jìn)制表示為00000000 01101010,按位取反后為11111111 10010101,所以a的結(jié)果為0 xff95。 注意運(yùn)算量的位數(shù)!P552.5 運(yùn)算符的優(yōu)先級(jí)和結(jié)合性小結(jié)一、優(yōu)先級(jí)當(dāng)某個(gè)運(yùn)算分量的兩邊均有運(yùn)算符時(shí),此時(shí)該運(yùn)算分量將參與哪邊運(yùn)算符的運(yùn)算就要考慮運(yùn)算符的優(yōu)先級(jí),如: b+c * d中的c將和d一起參與乘法運(yùn)算,然

30、后中間結(jié)果與b一起參與加法運(yùn)算。下面給出一些解釋,它有助于掌握C 的運(yùn)算符優(yōu)先原則:P563、基本運(yùn)算符優(yōu)先級(jí)最高,在任何情況下“()”最優(yōu)先。1、所有運(yùn)算符歸納為8層:基本運(yùn)算符單目運(yùn)算符 算術(shù)運(yùn)算符關(guān)系運(yùn)算符邏輯運(yùn)算符 條件運(yùn)算符賦值運(yùn)算符逗號(hào)運(yùn)算符;2、位運(yùn)算符優(yōu)先級(jí)容易混淆,通常使用括號(hào)。除了移位運(yùn)算符外,其它位運(yùn)算符與邏輯運(yùn)算符相鄰,但比邏輯運(yùn)算符優(yōu)先級(jí)高,又比關(guān)系運(yùn)算符低。4、單目運(yùn)算符比二目、三目運(yùn)算符優(yōu)先級(jí)高。5、算術(shù)運(yùn)算符優(yōu)先級(jí)比關(guān)系運(yùn)算符高。6、關(guān)系運(yùn)算符優(yōu)先級(jí)比邏輯運(yùn)算符高。移位運(yùn)算符位邏輯運(yùn)算符位反運(yùn)算符3P577、條件運(yùn)算符優(yōu)先級(jí)高于賦值運(yùn)算符。8、賦值運(yùn)算符優(yōu)先級(jí)低

31、于除逗號(hào)運(yùn)算符以外的所有運(yùn)算符。9、逗號(hào)運(yùn)算符優(yōu)先級(jí)最低?;具\(yùn)算符:( ) . 單目運(yùn)算符:! + - - + (類型) * & sizeof( )算術(shù)運(yùn)算符: * / % + 移位運(yùn)算符:關(guān)系運(yùn)算符: = = !=位運(yùn)算符 :& |邏輯運(yùn)算符:& | |條件運(yùn)算符:?:賦值運(yùn)算符:= += = *= /= %= = &= = |=逗號(hào)運(yùn)算符,高低P58二、結(jié)合性 當(dāng)運(yùn)算分量兩邊的運(yùn)算符是同優(yōu)先級(jí)時(shí),這時(shí)就要考慮處于同優(yōu)先級(jí)的兩個(gè)運(yùn)算符的結(jié)合性了,即運(yùn)算分量將同哪一邊的運(yùn)算符結(jié)合。 C 語言中同優(yōu)先級(jí)的運(yùn)算符結(jié)合性不外乎兩種:左結(jié)合性、右結(jié)合性。絕大部分運(yùn)算符是左結(jié)合性,只有賦值運(yùn)算符、條件

32、運(yùn)算符和單目運(yùn)算符為右結(jié)合性。如:x=y=0; z += -x+ +y ;z += (-(x+) +y) ;+怎么解釋P592.6 格式化輸入輸出函數(shù)的進(jìn)一步討論格式字符說明d以帶符號(hào)的十進(jìn)制形式輸出整數(shù)(正數(shù)不輸出符號(hào))o以八進(jìn)制無符號(hào)形式輸出整數(shù)x,X以十六進(jìn)制無符號(hào)形式輸出整數(shù),用x則輸出十六進(jìn)制數(shù)的a-f時(shí)以小寫形式輸出.用X時(shí),則以大寫字母輸出u以無符號(hào)十進(jìn)制形式輸出整數(shù)c以字符形式輸出,只輸出一個(gè)字符s輸出字符串f以小數(shù)形式輸出單雙精度數(shù),隱含輸出6位小數(shù)e,E以指數(shù)形式輸出實(shí)數(shù),如用E,則輸出時(shí),指數(shù)以大寫E表示(如1.2E+02)2.6.1.格式化輸出函數(shù)printf()回顧P

33、60在格式說明中,在%和上述格式字符間可以插入以下幾種附加符號(hào)(又稱修飾符)見下表: 字符 說明 字母(h)m.nm(代表一個(gè)正整數(shù))n(代表一個(gè)正整數(shù)) -3用于長(短)整型整數(shù),可加在格式符d,o,x,u前面L()用于實(shí)型數(shù)據(jù),float型(%f)double型(f) long double(%Lf) 最小輸出寬度(輸出顯示區(qū)域至少有m字符位,不足時(shí)常用空格補(bǔ)充)對(duì)實(shí)型數(shù)據(jù),表示輸出小數(shù)點(diǎn)后n位;對(duì)字符串,表示只顯示前面n個(gè)字符輸出的數(shù)字或字符在域內(nèi)向左靠;無-時(shí),在域內(nèi)向右靠P61(1).整數(shù) %d, %md適用于int型printf(%3d,%3d,x,y);若x=12,y=12345

34、,則輸出結(jié)果為 12,12345 %d, %md適用于long型long int x=256790;printf(“%d”,x);/正確如將上面printf函數(shù)中的“%d”改為“%8d”,則輸出為: 256790printf(“%d”,x);/錯(cuò)誤%uunsigned long%huunsigned short%hdshort%uunsigned int%xint(16進(jìn)制表示)2P62(2) 字符串s格式符,用來輸出一個(gè)字符串。有幾種用法: %s,例如:printf(%s,CHINA);輸出“CHINA”字符串(屏幕顯示時(shí)沒有雙引號(hào))。 %ms,%-ms,若串長小于m,則%ms在m列范圍內(nèi),

35、字符串向左靠,右補(bǔ)空格,%-ms左補(bǔ)空格。 %m.ns, %-m.ns,輸出字符串中左端n個(gè)字符【例】printf(%3s,%7.2s,%.4s,%- 5.3sn, HUST,HUST,HUST,HUST);輸出:HUST, HU,HUST,HUS P63(3) 浮點(diǎn)數(shù) %f,要求輸出小數(shù)點(diǎn)后6位小數(shù),不足6位常用0填充,等價(jià)于%.6f。 %m.nf,m含義同前面,要求顯示n位小數(shù)。 %-m.nf,與%m.nf基本相同,只是使輸出的數(shù)值向左端靠,右端補(bǔ)空格。 并非全部數(shù)字都是有效數(shù)字P64例 輸出實(shí)數(shù)時(shí)指定小數(shù)位數(shù)。#include void main( ) float x=357.987;

36、printf(%f ,%10f,%10.2f, %.2f %-10.2fn, x , x , x , x , x );輸出結(jié)果如下:357.987000,357.987000, 357.99,357.99 , 357.99 2P65 scanf格式字符表: 格式字符 說明 d要求輸入有符號(hào)的十進(jìn)制整數(shù)沒有u o要求輸入無符號(hào)的八進(jìn)制整數(shù) x, X要求輸入無符號(hào)的十六進(jìn)制整數(shù)(大小寫作用相同) c要求輸入單個(gè)字符 s要求輸入字符串,在輸入時(shí)以空白字符開始,以一個(gè)空白字符結(jié)束。 f要求輸入實(shí)數(shù),可以用小數(shù)形式或指數(shù)形式輸入2P66 scanf的附加格式說明字符表: 字符 說明 l用于輸入長整型數(shù)據(jù)

37、(可用%ld,%lo,%lx)以及double型數(shù)據(jù)(可用lf)longdouble(%Lf) h用于輸入短整型數(shù)據(jù)(可用%hd,%ho,%hx) 域?qū)抦(無.n)指定輸入數(shù)據(jù)所占寬度(列數(shù)),域?qū)拺?yīng)為正整數(shù) *表示本輸入項(xiàng)在讀入后不賦給相應(yīng)變量2 %c格式輸入時(shí)需要注意清除鍵盤緩沖區(qū)中剩下沒用的數(shù)據(jù),比如回車符如:scanf(“%d”,&i); scanf(“%c”,&ch);輸入8回車A回車,ch得不到字母A的ascii碼值改:scanf(“%d”,&i); fflush(stdin);/清空鍵盤 scanf(“%c”,%ch);P672.7 常見問題分析1. 數(shù)據(jù)的溢出問題數(shù)據(jù)有其固定的

38、表示范圍,因此當(dāng)數(shù)據(jù)的值超出了其范圍時(shí),將出現(xiàn)溢出問題。例2.9 整型數(shù)溢出 (BC+3.0)#include int main( ) int a,b; a=0 x7fff;/VC6平臺(tái)則取0 x7fffffff b = a + 1; printf(%d,%dn,a,b); return 0;在上面這段程序中,變量a的值為32767,它在內(nèi)存中的表示為:a:0111 1111 1111 1111當(dāng)a加上1后,內(nèi)存中的表示為:1000 0000 0000 0000它的實(shí)際十進(jìn)制值為 -32768,與我們希望的32768的值不符,這就是因?yàn)橐绯鰡栴}而產(chǎn)生的錯(cuò)誤,在程序編寫過程中需要注意避免。2P6

39、82. 無符號(hào)整數(shù)與有符號(hào)整數(shù)的混合運(yùn)算問題例2.10 無符號(hào)整型數(shù)與有符號(hào)整型數(shù)混合運(yùn)算出錯(cuò)#include void main( ) int x = 1; unsigned int y = 2; printf(x - y = %d , (x - y)/2 = %d n,x - y , (x - y)/2);輸出結(jié)果為:x y = -1 , (x - y)/2 = 32767按照常理,我們認(rèn)為(1 - 2)/2結(jié)果應(yīng)該為-0.5,截去小數(shù)后,結(jié)果應(yīng)為 -1,但事實(shí)上并非如此,而是得到結(jié)果32767。分析如下:P69變量x,y的值分別為1和2,它在內(nèi)存中的表示為:x: 0000 0000 0000 0001y

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論