C++程序設計教程4_第1頁
C++程序設計教程4_第2頁
C++程序設計教程4_第3頁
C++程序設計教程4_第4頁
C++程序設計教程4_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

08:52:351C++程序設計教程(第二版)第四章計算表達Chapter4

ComputationalExpressing清華大學出版社錢能08:52:352計算表達:表達計算使用一系列操作,它依賴于特定語言的操作符功能,關乎數(shù)據(jù)類型的內(nèi)在特性,故計算表達目的在于深入剖析數(shù)據(jù)類型對于編程的影響,從而準確使用操作符學習方法:

1.掌握操作符的功能和相互關系(優(yōu)先級和結(jié)合性)

2.針對內(nèi)部數(shù)據(jù)類型,對一些典型的操作中的典型問題留下深刻印象08:52:353第四章內(nèi)容

名詞解釋(NameExplainations)

算術運算問題(ArithmeticProblems)

相容類型的轉(zhuǎn)換(CastCampatibleType)

關系與邏輯操作(Relation&LogicOperations)

位操作(BitOperations)

增量操作(IncrementOperations)

表達式副作用(Expression’sSideEffects)

08:52:3541.操作符(Operators)單目操作符:在一個操作數(shù)上施加的操作,如:-3雙目操作符:在二個操作數(shù)上施加的操作,如:5-3故有些操作符既是單目操作符,又是雙目操作符表達式:若干個操作數(shù)和操作符按語法規(guī)則構(gòu)成的操作,如:

a=-3-5+6*7/-8逗號表達式值為最后一個子表達式的值,但求值過程是從左至右逐項進行的。例如:D=(a=2,b=a+5,a*b);//d的值為1408:52:355左值和右值左值和右值是相對于賦值表達式而言的。左值表達式不但具有空間實體,還具有讀寫訪問權(quán)。右值可以是不占據(jù)內(nèi)存空間的臨時量或字面值,可以是不具有寫入權(quán)的空間實體。08:52:356例如:Constintb=5;A=b+2;B=a+2;//錯:b擁有空間但無寫入權(quán)(a=4)+=28;//(a=4)為左值08:52:35708:52:358優(yōu)先級:表達式中多個操作符的執(zhí)行順序的規(guī)定性,如:

*x++;

//先做x++

結(jié)合性:同級操作符的執(zhí)行順序的規(guī)定性,如:

a=b=6;//先做b=608:52:3592.算術運算問題(ArithmeticProblems)整型數(shù)表示范圍有限,如:

1+2+3+...+10000不能用整型變量累計的一般循環(huán)方法來解:intsum=0;for(inti=1;i<=10000;++i)sum+=i;cout<<sum<<“\n”;08:52:3510整型數(shù)的周而復始性,如:

unsignedinta=2000000000;unsignedintb=3000000000;cout<<a+b<<“\n”;

結(jié)果為:705032704//取模232而得

超過表示范圍的整型數(shù)不是報錯,而是表示成一個去掉進位后的余數(shù)08:52:3511中間結(jié)果溢出導致計算錯誤,如:

inta=100000;

intb=100000;

intc=1000;cout<<a*b/c<<"\n";cout<<a*(b/c)<<"\n";

結(jié)果為:

14100651000000008:52:3512浮點數(shù)的精度和有效位影響比較的正確性,如:

floatf1=7.123456789;floatf2=7.123456785;cout<<(f1!=f2?“notsame\n”:“same\n”);floatg=1.0/3.0;doubled=1.0/3.0;cout<<(g==d?“same\n”:“same\n”);結(jié)果為:samenotsame08:52:3513浮點數(shù)計算的近似性使精確性比較失敗,如:

doubled1=123456789.9*9;doubled2=1111111109.1;if(d1!=d2)cout<<“Notsame\n”;elsecout<<“Same\n”;if(abs(d1-d2)<1e-05)cout<<“Same\n”;elsecout<<“Notsame\n”;結(jié)果為:NotsameSame結(jié)論:使用浮點數(shù)進行相等和不想等比較的操作通常是有問題的。浮點數(shù)的相等比較,一般總是使用兩者相減的值是否落在0的臨域中來判斷的。----即小于10的負幾次方。08:52:351408:52:35153.相容類型轉(zhuǎn)換(CastCompatibleType

)

隱式轉(zhuǎn)換:整型和浮點型都是數(shù)值型,所以它們是相容類型.指針與整型不相容,如:

7.0/3=7.0/3.0//將3隱式轉(zhuǎn)換成浮點

=2.33333333…inta=‘a(chǎn)’+3;inta=9;int*ap=&a;3+ap//錯08:52:3516從表達能力弱的類型到強的類型的轉(zhuǎn)換是安全的,反之,會引起精度丟失.如:

floatf=7.0/3;//doublefloatinta=7.0/3;//doubleintcout.precision(9);cout<<fixed<<7.0/3<<“\n”;cout<<f<<“\n”<<a<<“\n”;

結(jié)果為:

2.3333333332.333333254208:52:3517可以用顯式轉(zhuǎn)換的方法,人為控制運算在一定的數(shù)據(jù)類型下工作,如:

doubled=sqrt(123456.0);inta=static_cast<int>(d)*8+5;intb=d*8+5;//隱式轉(zhuǎn)換為浮點cout<<a<<“\n”<<b<<“\n”;A=2000000000;B=1000000000;intc=(static_cast<double>(a)+b)/2;Cout<<a+b<<endl<<c<<endl;結(jié)果為:28132815-12949672961500000000static_cast<type>顯式轉(zhuǎn)換采用顯式轉(zhuǎn)換的第一個目的是為了維護整型數(shù)運算的一致性。另一個目的是為了得到正確的計算結(jié)果。08:52:351808:52:35194.關系與邏輯操作(Relations&LogicOperations

)=與==的區(qū)別intx=9;X=(x==9);//因為相等,值為1賦值給x,賦值表達式的值為1x=9;//賦值表達式的值為9X=(x==0);//因為不相等,值為0賦給x,賦值表達式的值為0注:賦值表達式也具有值,它的值就是所賦的值。邏輯表達式的值為0或1.08:52:35204.關系與邏輯操作(Relations&LogicOperations

)=與==的區(qū)別intx=9;if(x==0)cout<<“test1ok\n”;if(x=5)cout<<“test2ok\n”;if(x=0)cout<<“test3ok\n”;結(jié)果為:test2ok注:賦值表達式也具有值,它的值就是鎖賦的值。邏輯表達式的值為0或1.08:52:3521!=是操作符,=!不是操作符

intx=3;if(x!=9)cout<<“not9\n”;if(x=!9)cout<<“xisfalse\n”;條件表達式(x!=0)與(x)等同

intx=3;if(x!=0)cout<<x;if(x)cout<<x;08:52:3522不等式連寫的錯誤:

inta=-1,b=0,c=1;if(a<b<c)cout<<“ok1\n”;if(a<b&&b<c)cout<<“ok2\n”;結(jié)果為:

ok2

08:52:3523短路求值的妙用:

1、避免除0的惡果

if(b&&a/b>2)cout<<“ok\n”;2、

避免不必要的求值

if(a==0||b=func())cout<<”useless\n”;08:52:35245.位操作(BitOperations)

左移操作<<將整數(shù)最高位擠掉,在右端補0。如:

inta=12;//a為:00000000000000000000000000001100a=a<<1;//a為:0000000000000000000000000001100008:52:3525右移操作>>在整數(shù)的高位擠一個0或1進去(有符號數(shù)擠符號位,無符號數(shù)擠0),而整數(shù)最低位被擠掉。如:

shortinta=-2;//1111111111111110a=a>>1;//a=-1即1111111111111111unsignedshortintb=65535;//1111111111111111b=b>>1;//b=32767即011111111111111108:52:3526位與操作&將兩個操作數(shù)每一位做與操作,如:

inta=12;//a為:00000000000000000000000000001100intb=6;//b為:00000000000000000000000000000110//a&b為:00000000000000000000000000000100intcbit=a&b;intclogic=a&&b;cout<<cbit<<“\n”<<clogic<<“\n”;

結(jié)果為:(比較&與&&的區(qū)別)4108:52:3527位或操作|將兩個操作數(shù)每一位做或操作,如:

inta=12;//a為:00000000000000000000000000001100

intb=6;//b為:00000000000000000000000000000110//a|b為:00000000000000000000000000001110

intcbit=a|b;

intclogic=a||b;cout<<cbit<<“\n”<<clogic<<“\n”;

結(jié)果為:(比較|與||的區(qū)別)14108:52:35286.增量操作(IncrementOperations)

前增量與后增量:前增量可以當左值。

constintd=8;d++;//錯:d不是左值

3++;//錯:3不是左值

inta=3,x=3,b,c;

b=++a;//a的前增量操作,使b為4c=x++;//x的后增量操作,使c為3a++-=2;//錯:a++不是左值

++a+=5;//ok:++a是左值且a最后為9++a++;//錯:先做a++,而a++不是左值08:52:3529編譯的貪吃特征:

inta=3,b=5,c;c=a++b;//錯:理解為a++bc=a+++b;//ok:a+++bc=a++++b;//錯:理解為a++++bc=a+++++b;//錯:理解為a+++++b08:52:3530指針的增量操作:chars1[10],s2[]=“hello”;char*p1=s1,*p2=s2;while(*p1++=*p2++);等價于下列操作序列:while(*p2){*p1=*p2;p1++;p2++;}*p1=0;12301661230082HelloHelp1p208:52:35317.表達式副作用(Expression’sSideEffects)

表達式的值

溫馨提示

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

評論

0/150

提交評論