C++運算符與表達式_第1頁
C++運算符與表達式_第2頁
C++運算符與表達式_第3頁
C++運算符與表達式_第4頁
C++運算符與表達式_第5頁
已閱讀5頁,還剩48頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章運算符與表達式

運算符(operator)也稱為操作符,對程序中的數(shù)據(jù)進行運算。參與運算的數(shù)據(jù)稱為操作數(shù)(operand)。變量、字面常量等通過運算符組合成表達式,一個表達式也能作為操作數(shù)來構(gòu)成更復雜的表達式。表達式(expression)是構(gòu)成程序語句的根本要素。3.1根本運算符對于運算符,應注意以下幾方面。(1)運算符的功能和語義。(2)運算符的操作數(shù)。每個運算符對其操作數(shù)的個數(shù)、類型和值都有一定限制。(3)運算符的優(yōu)先級(precedence)。每個運算符都有確定的優(yōu)先級。(4)運算符的結(jié)合性(associativity)。表3.1給出了C++中的主要運算符的功能、優(yōu)先級、目數(shù)、結(jié)合性。表中按優(yōu)先級從高到低分為16個級別。根本運算符優(yōu)先級運算符功能及說明結(jié)合性目數(shù)1()改變運算優(yōu)先級左向右雙目::作用域解析、全局[]數(shù)組下標.->訪問成員,由指針訪問成員2++--后綴自增、自減運算單目newdelete動態(tài)分配或釋放內(nèi)存++--前綴自增、自減運算符*間接訪問dereference&取地址address-of+-正、負號!邏輯非~按位取反sizeof取類型或變量的長度(type)強制類型轉(zhuǎn)換右向左2*.*->*由成員指針訪問成員左向右雙目Operator.doc優(yōu)先級運算符功能及說明結(jié)合性目數(shù)3*/%乘、除、取余左向右雙目4+-加、減左向右雙目5<<>>左移位、右移位左向右雙目6<><=>=小于、大于、小于等于、大于等于左向右雙目7==!=等于、不等于左向右雙目8&按位與左向右雙目9^按位異或左向右雙目10|按位或左向右雙目11&&邏輯與左向右雙目12||邏輯或左向右雙目13?:條件運算右向左三目14=*=/=%=+=-=<<=>>=&=|=^=賦值運算右向左雙目15,逗號運算左向右雙目3.1.1算術(shù)運算符+、-〔正號、負號,單目運算〕+、-、*、/、%〔雙目運算〕+、-、*、/按通常的算術(shù)規(guī)定。注意:對于除,假設兩個操作數(shù)都是整數(shù),結(jié)果為整數(shù)〔商局部〕。1/2=05/2=2%通常稱為取模運算,兩個操作數(shù)必須都是整型數(shù),結(jié)果為余數(shù),余數(shù)的符號與左邊數(shù)的符號等同。3%2=1-3%2=-13%-2=1-3%-2=-18%4=0在算術(shù)運算中需要注意溢出問題。兩個整數(shù)做加法、減法或乘法運算時,即便結(jié)果溢出也不是錯誤。例如:shorts1=32765;s1=s1+3; //結(jié)果是否超過short的最大值?cout<<s1<<endl; //輸出-32768,而不是32768。實際上,觀察二進制數(shù)據(jù),這兩個值是一樣的。3.1.2關系運算<、<=、>、>=、==、!===與=:注意:a=5賦值運算;a==5;判斷是否相等a<=x<=b與數(shù)學上的x取值區(qū)間a

x

b不同關系運算的結(jié)果是一個表示“真”或“假”的邏輯值,即一個bool值。當關系成立時,其運算結(jié)果為真;當關系不成立時,結(jié)果為假。但C語言中沒有邏輯型,關系運算的結(jié)果要用一個int值表示,0即為假,1即為真。a=2b=3c=4a>20a>b+c0a==21'a'>'A'b=='a'+1c-a==aa=='a'0a>'a'0b=a==21關系運算符的優(yōu)先級為(括弧中運算符的優(yōu)先級相同):(>、>=、<、<=)高于(==、!=)。關系運算符的優(yōu)先級比算術(shù)運算符低,但比賦值運算符(=)高。如:inta=5,b=3,c=6,d;d=a>b==c;//等價于d=((a>b)==c);d的值為0d=a==b<c;//等價于d=(a==(b<c));d的值為0d=a>b<=c;//等價于d=((a>b)<=c);d的值為1可以使用()來改變運算符的計算次序。既然關系運算的結(jié)果是一個邏輯值,那么就可以保存在一個邏輯型bool變量中。例如:boolb=a>5;由于浮點數(shù)在計算機內(nèi)進行運算和存儲時會產(chǎn)生誤差,因此在比較兩個浮點數(shù)時,建議不要直接比較兩數(shù)是否相等。例如,執(zhí)行下面語句:doubled1=3.3333,d2=4.4444; if(d1+d2==7.7777) cout<<"相等"<<endl; else{ cout<<"不等"<<endl; cout<<d1+d2<<endl; }條件語句中用“==”來判斷浮點數(shù)是否相等,結(jié)果是不等,但d1+d2輸出結(jié)果卻是7.7777。兩個實型數(shù)即便輸出結(jié)果完全一樣,其內(nèi)部值也可能不一樣。判斷兩個實數(shù)是否相等的正確方法是:判斷兩個實數(shù)之差的絕對值是否小于一個給定的允許誤差數(shù),如判斷d1是否等于d2時,應改為:fabs(d1-d2)<=1e-6其中,fabs()是計算絕對值的一個庫函數(shù),使用時要包含頭文件math.h。3.1.3邏輯運算符對邏輯值進行運算的運算符就是邏輯運算符。C++語言提供了3個邏輯運算符,用于表示操作數(shù)之間的邏輯關系,它們是!(邏輯非)、&&(邏輯與)、||(邏輯或)。邏輯運算的結(jié)果仍然是邏輯值。邏輯非(!)是單目運算符,它對操作數(shù)進行取反運算。當操作數(shù)為非0(邏輯真)時,!運算后結(jié)果為0(邏輯假)。反之,假設操作數(shù)為0(邏輯假),!運算后結(jié)果為1(邏輯真)。注意,所有非0的值在邏輯上都作為“真”。例如:cout<<!4<<endl; //輸出0,假cout<<!-4<<endl; //輸出0,假cout<<!4.1<<endl; //輸出0,假cout<<!-4.1<<endl; //輸出0,假&&和||運算符是雙目運算符。運算規(guī)那么如下:&&(邏輯與)表示“而且”的語義。||(邏輯或)表示“或者”的語義。例如:!(2>6) //結(jié)果為1,真7>3&&10>6 //結(jié)果為1,真5>2||4>8 //結(jié)果為1,真4&&5<6 //結(jié)果為1,真邏輯運算符的運算優(yōu)先級為:!高于&&高于||。注意,!的優(yōu)先級具有較高優(yōu)先級,甚至高于算術(shù)運算符。而&&和||的優(yōu)先級那么比算術(shù)運算符和關系運算符低。因C++將邏輯值保存為整數(shù)值,這樣使得邏輯值可參與所有的運算,而且邏輯運算符可作用于所有類型的值,而沒有語法錯誤提示。這是C/C++語法不嚴密之處。讀者應注意防止。例3.1邏輯運算符的例子。include<iostream> //A注意,不是iostream.husingnamespacestd; //B導入命名空間stdvoidmain(void){ inta,b; boolres1,res2,res3,res4,res5;

a=3;b=5; res1=a>3&&b>=5; res2=a>3||b>=5; res3=!(b>=5); res4=!(a==b); res5=a>b&&b<6;

cout<<boolalpha; //C cout<<"res1="<<res1<<'\t'; cout<<"res2="<<res2<<'\t'; cout<<"res3="<<res3<<'\t'; cout<<"res4="<<res4<<'\t'; cout<<"res5="<<res5<<endl;}3.1.4位運算符位運算是指對字節(jié)內(nèi)部的二進制位進行移位或邏輯運算。位運算是通過位運算符來完成的。位運算的操作數(shù)必須是char、short、或int值,而且結(jié)果也是char、short或int值。除了按位求反~是單目運算符,其余位運算都是雙目運算符。C++提供了兩類位運算:移位運算和按位邏輯運算。1.移位運算符移位運算符的格式為:operand<<n將操作數(shù)operand向左移動n個二進制位,右邊補0,可能改變符號。operand>>n將操作數(shù)operand向右移動n個二進制位,保持符號不變。其中,n為整數(shù)。注意移位運算并不改變operand本身的值。例如:shortoperand=0x8,n=3;shorta=operand<<n; //結(jié)果為0x40操作數(shù)左移n個二進制位后,右邊移出的空位用0補齊。當左移時,對于帶符號數(shù),最高位表示符號,可能會因為低位的1或0移到最高位,最終改變操作數(shù)的符號。如:shorts=4567;shortresult=s<<3;cout<<result;//輸出:-29000如果操作數(shù)是正數(shù),而且左移沒有導致改變符號,那么左移n位,相當于乘以2n。我們知道,int型的數(shù)值范圍是-231到231-1。下面代碼利用左移位來得到int型的最小值和最大值。intmin=1<<31;cout<<"min="<<min<<endl;intmax=(1<<31)-1;cout<<"max="<<max<<endl;顯示結(jié)果為:min=-2147483648max=2147483647對帶符號數(shù)右移,操作數(shù)右移n位后,左邊移出的空位用符號位補齊,最高位始終補與原來最高位相同的數(shù),這樣右移不會改變符號。如:shortoperand=-23116,m=3;//移動前為0xa5b4shortb=operand>>m;結(jié)果為0xf4b6,即-2890對于移位運算,注意以下幾點:(1)不要嘗試對float或double數(shù)據(jù)進行移位運算,編譯會出錯。(2)移動位數(shù)n應不大于左操作數(shù)的位數(shù),如int移位應不大于32。如果n大于左操作數(shù)位數(shù),實際移動位數(shù)要自動按字長取模:n%(sizeof(int))。例如,i<<33就是i左移1位。(3)當移動位數(shù)n為負值,C語言標準沒有確定是什么結(jié)果。在VC6中,左移<<負值位數(shù),相當于循環(huán)右移,即移出的位補回到最高位。右移>>負值位數(shù),結(jié)果總為0。(4)左移位<<與cout<<可能混淆,右移位>>與cin>>可能混淆,可用括號消除這些錯誤,例如cout<<(k<<3)。按位邏輯運算符按位邏輯運算有4個:求反~、與&、或|、異或^。(1)按位求反“~”運算符是一個單目運算符,對操作數(shù)逐位取反,得到反碼。假設二進制位為0,那么取反后為1;假設二進制位為1,那么取反后為0。例如:shortintm=~0xc3//結(jié)果為0xff3c運算符具有比較高的優(yōu)先級,高于一般的算術(shù)運算符。而其它按位邏輯運算符的優(yōu)先級那么比較低。(2)按位邏輯與“&”對兩個操作數(shù)逐位進行運算。假設對應位都為1,那么該位結(jié)果為1,否那么為0。例如:0xc300000000110000110x6e0000000001101110a0000000001000010shortinta=0xc3&0x6e //結(jié)果為0x42(3)按位邏輯或“|”對兩個操作數(shù)逐位進行運算。假設對應位都為0,那么該位結(jié)果為0,否那么為1。例如:shortintb=0x12|0x3d //結(jié)果為0x3f(4)按位邏輯異或“^”也是對兩個操作數(shù)逐位進行運算。異或運算的規(guī)那么是,假設對應位不同,那么該位結(jié)果為1,否那么為0。例如:shortintc=0x5a^0x26 //結(jié)果為0x7c按位邏輯異或有一個特點,如果a^b=c,那么c^b=a。b將a轉(zhuǎn)換為c,也能將c再復原為a。顯然,兩個相等的值異或運算,結(jié)果為0。不相等的兩個值異或運算結(jié)果不為0。3.1.5條件運算符C++中唯一的三目運算符就是條件運算符,由兩個符號“?”和“:”組成,要求有3個操作數(shù),形式如下:<表達式1>?<表達式2>:<表達式3>根據(jù)<表達式1>為真或假,選擇<表達式2>或<表達式3>作為運算結(jié)果。(1)條件表達式的執(zhí)行順序為:先求解表達式1,假設值為非0,表示條件為真,那么求解表達式2,此時表達式2的值就作為整個條件表達式的結(jié)果;假設表達式1的值為0,表示條件為假,那么求解表達式3,表達式3的值就是整個條件表達式的值。例如:a>b?a:b結(jié)果是a和b的較大值。(2)通常情況下,表達式1應該是一個關系表達式或邏輯表達式,表達式2和表達式3可以是常量、變量或表達式,而且應該是相同類型。例如:x==y?'Y':'N'(d=b*b-4*a*c)>=0?sqrt(d):sqrt(-d) //sqrt是開平方函數(shù)ch=ch>='A'&&ch<='Z'?ch+'a'-'A':ch;//大寫字母轉(zhuǎn)小寫(3)條件表達式的優(yōu)先級比較低,僅高于賦值和逗號運算符。(4)雖然C++標準文檔說明條件運算符的結(jié)合性為“從右向左”,但實際上并非如此。#include<iostream.h>voidmain(void){ inti=1,j=2,k=3; cout<<"Thelargervalueof:"http://求出i和j中的最大值

<<i<<"and"<<j<<"is" <<(i>j?i:j)<<endl; intmax=(i>=j?i:j)<k?k:(i>=j?i:j);//A cout<<"Thelargestvalueof:"http://求出i,j和k中的最大值

<<i<<","<<j<<"and"<<k <<"is"<<max<<endl;}3.1.6賦值運算符賦值運算就是將一個表達式的值賦給一個變量。C++語言提供了兩類賦值運算符:根本賦值運算符和復合賦值運算符。根本賦值運算符為“=”,復合賦值運算符有多種形式:+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=。(1)賦值運算符都是雙目運算符,從右向左進行。例如,sum1=sum2=0相當于sum1=(sum2=0),先執(zhí)行sum2=0,后執(zhí)行sum1=sum2。(2)要求賦值運算符左操作數(shù)必須是左值,左值能存儲值。例如:x=3+5 //正確,x是左值x-3=5 //語法錯誤,x-3不是左值(3)復合賦值運算符是將算術(shù)運算或位運算與賦值相結(jié)合,同一個變量即參加運算,也是被賦值的變量,出現(xiàn)在賦值運算符的兩邊。復合賦值運算符是一個整體,中間不能用空格隔開。例如:a*=6 //相當于a=a*6a%=6 //相當于a=a%6a+=3+6 //相當于a=a+(3+6)初學者容易犯的一個錯誤就是混淆“=”運算符和“==”運算符。分析下面代碼:inta=5,b=3;intd=a==b; //d的值為03.1.7逗號運算符逗號“,”既是標點符號(用做分隔符),又是運算符。逗號運算符用來將兩個表達式連接起來,逗號表達式的一般表達形式為:<表達式1>,<表達式2>,<表達式3>,…,<表達式n>逗號運算符是雙目運算符,取其右邊操作數(shù)的值作為整個表達式的結(jié)果。逗號運算符的優(yōu)先級最低。例如:inti,j,k; //作標點符號用funx(x,y,z); //作標點符號用a+b,a+c //逗號運算符1+4,3.4+10,3&4 //逗號運算符x=3+6,x*3,x+6 //第一個逗號運算結(jié)果為27,第二個逗號運算結(jié)果為15x=(y=3,y+1) //y的值為3,x的值為4例3-3逗號運算符的使用。#include<iostream.h>voidmain(void){inta=3,b=7,c=4,t,x; t=(a+=1,b-=2,c+3); x=3+6,x*3,x+6; cout<<"a="<<a<<'\t'; cout<<"b="<<t<<'\t'; cout<<"c="<<c<<'\t'; cout<<"t="<<t<<endl; cout<<"x="<<x<<endl;x=(x=3+6,x*3),x+6; cout<<"x="<<x<<endl; x=(x=3+6,x*3,x+6); cout<<"x="<<x<<endl; x=(x=3+6,x=x*3,x+6); cout<<"x="<<x<<endl;}3.1.8自增、自減運算符自增、自減運算就是對一個變量加1或減1。自增用“++”運算符,而自減用“--”運算符,它們都是單目運算符。運算符“++”和“--”是一個整體,中間不能用空格隔開。自增(或自減)運算符要區(qū)分前綴和后綴兩種形式。前綴形式,運算符放在操作數(shù)左邊,例如++count。先使操作數(shù)自增(自減)1個單位后,然后取其值作為運算結(jié)果。后綴形式,運算符放在操作數(shù)右邊,例如count++,先取操作數(shù)的值參與當前表達式的運算,然后再使操作數(shù)自增(自減)1個單位。例如:intcount=15,digit=16,number,amount; number=++count; //count和number都為16amount=digit++; //amount的值為16,digit的值為17自增、自減運算符要求操作數(shù)必須是左值,往往是一個變量。前綴式的計算結(jié)果是操作數(shù)修改后的值,因此結(jié)果仍然是一個左值;而后綴式的值是原先操作數(shù)的值,所以它不是左值。如:intamt=63,nut=96; ++++amt; //相當于++(++amt),結(jié)果為65++nut--; //相當于++(nut--),nut--不是左值,所以語法錯誤(++nut)--; //++nut是左值,所以語法正確自增、自減運算符具有較高的優(yōu)先級,高于所有的算術(shù)運算符。例3-4自增、自減運算符的使用。#include<iostream.h>voidmain(void){ inta=2,b=3; intc,d,e; c=++a+b--; //c=3+3 cout<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"c="<<c<<endl; d=++++a+++b; //d=5+3 cout<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"d="<<d<<endl; e=a++-----b; //e=5-1 cout<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"e="<<e<<endl;}程序運行后,在屏幕上輸出的結(jié)果為:a=3b=2c=6a=5b=3d=8a=6b=1e=4在上面這些運算符中,只有賦值運算符和自增自減運算符可以更改左值,常稱為副作用(sideeffect)。應防止在同一個表達式中對同一個變量進行屢次自增自減運算,否那么結(jié)果難以合理解釋。例如:inta=2;intb=++a+++a; 最后b的值為8,a為4。實際上b=4+4,而不是b=3+4。再如:a=2;intc=a+++++a;最后c的值為6,a為4。實際上c=3+3,而不是c=2+3。一個比較合理的解釋是這里的+運算是從右向左計算的(但這違背+的結(jié)合性,從左向右),真正執(zhí)行的是:intc=++a+a++;注意,盡管后綴自增自減運算符具有比較高的優(yōu)先級,也不能先計算。例如: inta=2; intb=3+(a++);//等同于b=3+a++此時變量b的值是3+2,而不是3+3。3.1.9sizeof運算符每種類型的變量都占用一定大小的存儲單元。存儲單元的大小與變量類型、CPU及操作系統(tǒng)有關。sizeof運算符用于測試某種數(shù)據(jù)類型或表達式的類型在內(nèi)存中所占的字節(jié)數(shù),它是一個一元運算符。其語法格式為:sizeof(<類型名>)或sizeof(<表達式>)例如:sizeof(int) //整數(shù)類型占4個字節(jié),結(jié)果為4sizeof(3+3.6)//3+3.6的結(jié)果為double實數(shù),結(jié)果為83.1.10typeid運算符對于任何一個表達式,應該知道它的類型究竟是什么。例如:inti=-2;unsignedj=3;cout<<i*j<<endl; //輸出4294967290表達式i*j的類型是什么?C++提供了typeid運算符(稱為類型標識typeidentity),能獲取一個表達式在運行時刻的類型信息。該運算符要求包含一個文件<typeinfo.h>,還要再調(diào)用一個函數(shù)name()。例3-6typeid運算符的例子。#include<iostream.h>#include<typeinfo.h>voidmain(){ inti=-2; unsignedj=3; cout<<i*j<<endl; cout<<typeid(i*j).name()<<endl; }3.2表達式表達式(expression)是由運算符、括號和操作數(shù)(operand)構(gòu)成的序列,在運行時能計算出一個值的結(jié)果。按運算符的不同,可將表達式分為算術(shù)表達式、賦值表達式、關系表達式、邏輯表達式、逗號表達式等等。按表達式能否放在賦值號的左邊還是右邊,可將表達式分為左值表達式和右值表達式。表達式按照其中運算符的優(yōu)先級和結(jié)合性來求值。每個表達式都有確定的運算結(jié)果(表達式的值)和所屬類型(即結(jié)果值的類型),其類型取決于表達式中的運算符和操作數(shù)的類型。3.2.1左值表達式和右值表達式能放在賦值號左邊的表達式稱為左值表達式,簡稱左值(l-value)。左值表達式必須能指定一個存放數(shù)據(jù)的空間,一般是變量,但不能是const修飾的變量。右值表達式就是能放在賦值號右邊的表達式,簡稱為右值(r-value)。3.2.2算術(shù)表達式由算術(shù)運算符、位運算符和操作數(shù)構(gòu)成的表達式稱為算術(shù)表達式。3.2.3賦值表達式由賦值運算符和操作數(shù)構(gòu)成的表達式稱為賦值表達式。賦值表達式要求賦值運算符左邊必須是左值,其功能就是用右值表達式的值來更改左值。賦值表達式的計算順序是從右向左進行的,運算結(jié)果取左值表達式的值。使用復合賦值表達式可使語句表達更簡練。對賦值表達式說明以下幾點。(1)賦值表達式的結(jié)果是左值,因此可出現(xiàn)在賦值運算符“=”的左邊。例如:(x=5)=23+6//x=5是左值,被改為29,即x和整個表達式的值為29x=y=z=0 //先使z=0,然后再將z的值賦給y,最后將y的值賦給x(2)說明語句中的符號“=”用來初始化,盡管在書寫上與賦值運算符“=”一樣,但含義卻不同。floatradius1=5.63f; //說明變量radius1,并初始化成5.36intsum1=total1=0; //語法錯誤,要求分別初始化sum1和total1floatradius; //說明變量radiusradius=5.63f; //給變量radius賦值3.2.4關系表達式由關系運算符和操作數(shù)構(gòu)成的表達式稱為關系表達式。其中的操作數(shù)可以是任何類型的表達式。關系表達式的結(jié)果為邏輯值,即表達式中的關系成立時,其值為邏輯真(用1表示),否那么其值為邏輯假(用0表示)。關系表達式通常用來構(gòu)造簡單條件表達式,用在程序流程控制語句中。例如:if(x>0) y=x; //如果x大于0,y取x的值elsey=-x; //如果x不大于0,y取-x的值,最后y是x的絕對值注意,“=”和“==”含義完全不同,注意不要誤寫。試比較下面兩個程序段:if(x==168)… //判斷x是否等于168,條件可能成立,也可能不成立if(x=168)… //將值168賦給x,計算結(jié)果為邏輯1,條件永遠成立3.2.5邏輯表達式由邏輯運算符和操作數(shù)構(gòu)成的表達式稱為邏輯表達式。邏輯表達式的運算結(jié)果為邏輯值,一般用來構(gòu)造比較復雜的條件表達式。邏輯表達式中往往包含多個關系表達式,要先計算關系表達式的值,再計算邏輯表達式。但邏輯與(&&)和邏輯或(||)運算符在運算時,從左向右計算,根據(jù)規(guī)那么一旦能確定整個表達式的值時,就結(jié)束計算,后面的表達式就不再計算。(1)對于<條件1>&&<條件2>邏輯表達式,先計算<條件1>的值,假設其值為邏輯真(非0),就再計算<條件2>的值,假設其值為非0,那么結(jié)果為1,否那么為0。假設<條件1>的值為邏輯假(值為0),就已經(jīng)知道整個表達式為假,就不再計算<條件2>的值,結(jié)束整個表達式的計算。例如:year%4==0&&year%100!=0用&&來連接兩個條件,前一個條件滿足是后一個條件計算的前提。(2)對于<條件1>||<條件2>邏輯表達式,先計算<條件1>的值,假設其值為假,再計算<條件2>的值,并將<條件2>的值作為整個表達式的值。假設<條件1>的值為真,就已經(jīng)知道整個表達式的值為真,就結(jié)束整個表達式計算。例如:year%400==0||year%4==0&&year%100!=03.2.6逗號表達式由逗號運算符和操作數(shù)組成的表達式稱為逗號表達式,就是用逗號將多個表達式分隔起來,從左向右逐個計算各個表達式,并將最右邊的表達式作為逗號表達式的值。例如:intp,w,x=8,y=10,z=12;w=(x++,y,z+3)-5; //w的值為(z+3)-5,即10p=x+5,y+x,z;//p的值為x+5,即15,z的值12作為逗號表達式的值如果逗號運算符的右操作數(shù)是一個左值,該逗號運算的結(jié)果也是左值。例如:(y++,z)=2 //z是左值,(y++,z)的結(jié)果也是左值,z的值被改為23.2.7表達式語句任何一個表達式后加上一個分號“;”就構(gòu)成一條表達式語句。表達式語句的一般格式為:<表達式>;注意,分號是構(gòu)成語句的組成局部,而不是作為語句之間的分隔符。例如:x=20;3*8-9;y=a+b*c;i=0,j=0;i++;這些都是合法的表達式語句,第二個表達式語句只做了算術(shù)運算,并沒有保存結(jié)果,即沒有副作用,在程序中應消除這些沒用的表達式語句。3.3類型轉(zhuǎn)換每個運算符的操作數(shù)的個數(shù)及類型都有特定限制。在一個表達式中,運算符的某個操作數(shù)如果不符合類型要求,就要對操作數(shù)進行類型轉(zhuǎn)換。C++中的類型轉(zhuǎn)換有3種:自動類型轉(zhuǎn)換、賦值轉(zhuǎn)換和強制類型轉(zhuǎn)換。3.4.1自動類型轉(zhuǎn)換自動類型轉(zhuǎn)換(也稱隱式類型轉(zhuǎn)換)指系統(tǒng)自動地將表達式中的操作數(shù)轉(zhuǎn)換成所需類型的值,轉(zhuǎn)換順序為由范圍較小的類型向范圍較大的類型轉(zhuǎn)換。規(guī)那么1。兩個不同類型的操作數(shù)進行運算時,先將較小范圍的數(shù)值轉(zhuǎn)換為另一個較大范圍的數(shù)值,然后再進行計算。各種根本數(shù)據(jù)類型的數(shù)值范圍從小到大排列次序如下:char,bool→short→int→float→doubleunsignedchar→unsignedshort→unsignedint→float→double例如定義兩個變量a和f:inta=100;floatf=32.2f;那么計算以下表達式:a/f處理過程為:先將a的值轉(zhuǎn)換成float型,然后再進行浮點數(shù)的除法運算,結(jié)果為一個float值3.10559。在這個過程中a變量的值不改變。分析下面兩行輸出結(jié)果是否一樣。shorts1=32765;cout<<s1+3<<endl;s1=s1+3; //Acout<<s1<<endl; 按規(guī)那么1可知,兩個有符號的值之間進行算術(shù)運算,其結(jié)果是有符號的。一個無符號的值與一個浮點數(shù)(如float)進行算術(shù)運算,其結(jié)果是浮點數(shù)(如float)。但兩個無符號的值之間進行算術(shù)運算(兩個值中沒有unsignedint),其結(jié)果是有符號的int。例如:unsignedcharc1=2;unsignedshorts1=3;cout<<(c1*s1)<<endl; //乘法,輸出6cout<<typeid(c1*s1).name()<<endl; //輸出int規(guī)那么2對于bool、char、short、int類型,任意兩個值之間進行算術(shù)運算、位運算,其結(jié)果都是一個int值。任意兩個值之間進行邏輯運算,其結(jié)果都是一個bool值。注意規(guī)那么2是規(guī)那么1的一個例外。例如:charc1=-2;shorts1=3;cout<<(c1*s1)<<endl; //乘法,輸出-6cout<<typeid(c1*s1).name()<<endl; //輸出intcout<<(c1&s1)<<endl; //按位與,輸出2cout<<typeid(c1&s1).name()<<endl; //輸出intcout<<(c1&&s1)<<endl; //邏輯與,輸出1,表示truecout<<typeid(c1&&s1).name()<<endl; //輸出bool規(guī)那么3。對于bool、char、short、int類型,任一個類型值(無論是否帶符號)與unsignedint之間進行算術(shù)運算,其結(jié)果都是unsignedint類型。注意規(guī)那么3又是規(guī)那么2的一個例外。例如:charc1=-2;unsignedshorts1=2;unsignedintj=3;cout<<(c1*j)<<endl;//乘法,輸出4294967290,而不是-6cout<<typeid(c1*j).name()<<endl;//輸出unsignedintcout<<(s1*j)<<endl; //乘法,輸出6cout<<typeid(s1*j).name()<<endl;//輸出unsignedint由上面例子可知,unsignedint被系統(tǒng)認為是整型數(shù)值中的最大范圍的類型,因此其它類型與之計算時,都要轉(zhuǎn)換到unsignedint。此時如果另一個整數(shù)恰好是負值,而結(jié)果是不帶符號的正值,就不能得到預期結(jié)果,但二進制結(jié)果是正確的,例如4294967290與-6是一樣的。在處理表達式的過程中,并不是將變量直接轉(zhuǎn)換成最大范圍的類型,而是在表達式處理過程中,按照需要逐步進行轉(zhuǎn)換。例如:inti=1;charch=2;floatf=3.0f;doubledf=4.0;cout<<(ch*i+f*2.0-df)<<endl;表達式ch*i+f*2.0-df的計算過程為:(1)將ch轉(zhuǎn)換為int型,計算ch*i,即2*1,結(jié)果為2,類型為int。(2)將f轉(zhuǎn)換為double型,計算f*2.0,即3.0*2.0,結(jié)果為6.0,類型為double。(3)將ch*i的結(jié)果2轉(zhuǎn)換為double型,計算2.0+6.0,結(jié)果為8.0,類型為double。(4)計算8.0-df,即4.0,整個表達式的結(jié)果為4.0,類型為double。自動類型轉(zhuǎn)換的根本規(guī)那么是“寬化”或者“提升”,即將較小范圍的數(shù)值類型轉(zhuǎn)換到較大范圍的數(shù)據(jù)類型。大多數(shù)自動類型轉(zhuǎn)換是平安的。3.4.2賦值轉(zhuǎn)換賦值類型轉(zhuǎn)換出現(xiàn)在初始化表達式或者賦值表達式中。當初始化或賦值運算符的左值表達式的類型與右值表達式類型不同,且類型兼容時,將進行類型轉(zhuǎn)換到左值類型。即先計算出右值表達式的值,然后將其轉(zhuǎn)換為左值類型后再賦給左值。例如:charch='b';shorts=ch; //char轉(zhuǎn)換到shortcout<<s<<endl; //輸出:98i

溫馨提示

  • 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

提交評論