C++(二):運(yùn)算符與表達(dá)式
來源:程序員人生 發(fā)布時間:2014-11-14 08:15:46 閱讀次數(shù):3498次
C++的運(yùn)算符
C++的運(yùn)算符10分豐富,使得C++的運(yùn)算10分靈活方便。例如把賦值號(=)也作為運(yùn)算符處理,這樣,a=b=c=4就是合法的表達(dá)式,這是與其他語言不同的。C++提供了以下運(yùn)算符:
- 算術(shù)運(yùn)算符
+(加) -(減) *(乘) /(除) %(整除求余) ++(自加) --(自減) - 關(guān)系運(yùn)算符
>(大于) <(小于) ==(等于) >=(大于或等于) <=(小于或等于) !=(不等于) - 邏輯運(yùn)算符
&&(邏輯與) ||(邏輯或) !(邏輯非) - 位運(yùn)算符
<<(按位左移) >>(按位右移) &(按位與) |(按位或) ^(按位異或) ~(按位取反) - 賦值運(yùn)算符 (=及其擴(kuò)大賦值運(yùn)算符)
- 條件運(yùn)算符 (?:)
- 逗號運(yùn)算符 (,)
- 指針運(yùn)算符 (*)
- 援用運(yùn)算符和地址運(yùn)算符 (&)
- 求字節(jié)數(shù)運(yùn)算符(sizeof)
- 強(qiáng)迫類型轉(zhuǎn)換運(yùn)算符( (類型) 或類型( ))
- 成員運(yùn)算符 (.)
- 指向成員的運(yùn)算符 (->)
- 下標(biāo)運(yùn)算符 ([ ])
- 其他 (如函數(shù)調(diào)用運(yùn)算符())
C++算術(shù)運(yùn)算符與算術(shù)表達(dá)式
基本的算術(shù)運(yùn)算符
在本章中主要介紹算術(shù)運(yùn)算符與算術(shù)表達(dá)式,賦值運(yùn)算符與賦值表達(dá)式,逗號運(yùn)算符與逗號表達(dá)式,其他運(yùn)算符將在以后各章中陸續(xù)介紹。
常見算數(shù)運(yùn)算符
運(yùn)算符 |
說明 |
舉例 |
+ |
加法運(yùn)算符,或正值運(yùn)算符 |
3+5,+3 |
- |
減法運(yùn)算符,或負(fù)值運(yùn)算符 |
5⑵,⑶ |
* |
乘法運(yùn)算符 |
3*5 |
/ |
除法運(yùn)算符 |
5/3 |
% |
模運(yùn)算符,或稱求余運(yùn)算符 |
%兩側(cè)均應(yīng)為整型數(shù)據(jù),如7%4的值為3 |
需要說明,兩個整數(shù)相除的結(jié)果為整數(shù),如5/3的結(jié)果值為1,舍去小數(shù)部份。但是,如果除數(shù)或被除數(shù)中有1個為負(fù)值,則舍入的方向是不固定的。例如,⑸/3在有的C++系統(tǒng)上得到結(jié)果⑴,有的C++系統(tǒng)則給出結(jié)果⑵。多數(shù)編譯系統(tǒng)采取“向零取整”的方法,即5/3的值等于1,⑸/3的值等于⑴,取整后向零靠攏。
如果參加+, -, *, / 運(yùn)算的兩個數(shù)中有1個數(shù)為float型數(shù)據(jù),則運(yùn)算的結(jié)果是double型,由于C++在運(yùn)算時對所有float型數(shù)據(jù)都按double型數(shù)據(jù)處理。
算術(shù)表達(dá)式和運(yùn)算符的優(yōu)先級與結(jié)合性
用算術(shù)運(yùn)算符和括號將運(yùn)算對象(也稱操作數(shù))連接起來的、符合C++語法規(guī)則的式子,稱C++算術(shù)表達(dá)式。運(yùn)算對象包括常量、變量、函數(shù)等。例如,下面是1個合法的C++算術(shù)表達(dá)式:
a*b/c⑴.5+'a'
C++語言規(guī)定了運(yùn)算符的優(yōu)先級和結(jié)合性。在求解表達(dá)式時,先按運(yùn)算符的優(yōu)先級別高低次序履行,例如先乘除后加減。如有表達(dá)式a-b*c,b的左邊為減號,右邊為乘號,而乘號優(yōu)先于減號,因此,相當(dāng)于a-(b*c)。如果在1個運(yùn)算對象兩側(cè)的運(yùn)算符的優(yōu)先級別相同,如a-b+c,則按規(guī)定的“結(jié)合方向”處理。
C++規(guī)定了各種運(yùn)算符的結(jié)合方向(結(jié)合性),算術(shù)運(yùn)算符的結(jié)合方向為“自左至右”,即先左后右,因此b先與減號結(jié)合,履行a-b的運(yùn)算,再履行加c的運(yùn)算。“自左至右的結(jié)合方向”又稱“左結(jié)合性”,即運(yùn)算對象先與左面的運(yùn)算符結(jié)合。以后可以看到有些運(yùn)算符的結(jié)合方向為“自右至左”,即右結(jié)合性(例如賦值運(yùn)算符)。關(guān)于“結(jié)合性”的概念在其他1些高級語言中是沒有的,是C和C++的特點之1,希望能弄清楚。
C++所有運(yùn)算符和它們的優(yōu)先級別和結(jié)合性請查看這里:C++運(yùn)算符優(yōu)先級表
表達(dá)式中各類數(shù)值型數(shù)據(jù)間的混合運(yùn)算
在表達(dá)式中常遇到不同類型數(shù)據(jù)之間進(jìn)行運(yùn)算,如:
10+'a'+1.5⑻765.1234*'b'
在進(jìn)行運(yùn)算時,不同類型的數(shù)據(jù)要先轉(zhuǎn)換成同1類型,然落后行運(yùn)算。轉(zhuǎn)換的規(guī)則按圖2.7所示。

圖2.7
假定已指定i為整型變量,f為float變量,d為double型變量,e為long型,有下面表達(dá)式:
10+'a'+i*f-d/e
運(yùn)算次序為:
- 進(jìn)行10+'a'的運(yùn)算,先將'a'轉(zhuǎn)換成整數(shù)97,運(yùn)算結(jié)果為107。
- 進(jìn)行i*f的運(yùn)算。先將i與f都轉(zhuǎn)換成double型,運(yùn)算結(jié)果為double型。
- 整數(shù)107與i*f的積相加。先將整數(shù)107轉(zhuǎn)換成雙精度數(shù)(小數(shù)點后加若干個0,即107.000…00),結(jié)果為double型。
- 將變量e轉(zhuǎn)換成double型,d/e結(jié)果為double型。
- 將10+'a'+i*f的結(jié)果與d/e的商相減,結(jié)果為double型。
上述的類型轉(zhuǎn)換是由系統(tǒng)自動進(jìn)行的。
C++自增和自減運(yùn)算符(--和++)
在C和C++中,常在表達(dá)式中使用自增(++)和自減(--)運(yùn)算符,他們的作用是使變量的值增1或減1,如:
++i(在使用i之前,先使i的值加1,如果i的原值為3,則履行j=++i后,j的值為4)
--i (在使用i之前,先使i的值減1,如果i的原值為3,則履行j=--i后,j的值為2)
i++ (在使用i以后,使i的值加1,如果i的原值為3,則履行j=i++后,j的值為3,然后i變成4)
i--(在使用i以后,使i的值減1,如果i的原值為3,則履行j=i--后,j的值為3,然后i變成2)
++i是先履行i=i+1后,再使用i的值;而i++是先使用i的值后,再履行i=i+1。
正確地使用++和--,可使程序簡潔?清晰?高效。請注意:
- 自增運(yùn)算符(++)和自減運(yùn)算符(--)只能用于變量,而不能用于常量或表達(dá)式。
- ++和--的結(jié)合方向是“自右至左”。
- 自增運(yùn)算符(++)和自減運(yùn)算符(--)使用10分靈活,但在很多情況下可能出現(xiàn)歧義性,產(chǎn)生“意想不到”的副作用。
- 自增(減)運(yùn)算符在C++程序中是常常見到的,經(jīng)常使用于循環(huán)語句中,使循環(huán)變量自動加1。也用于指針變量,使指針指向下1個地址。
C++強(qiáng)迫類型轉(zhuǎn)換
在表達(dá)式中不同類型的數(shù)據(jù)會自動地轉(zhuǎn)換類型,以進(jìn)行運(yùn)算。有時程序編制者還可以利用強(qiáng)迫類型轉(zhuǎn)換運(yùn)算符將1個表達(dá)式轉(zhuǎn)換成所需類型。例如:
(double)a (將a轉(zhuǎn)換成double類型)
(int)(x+y) (將x+y的值轉(zhuǎn)換成整型)
(float)(5%3) (將5%3的值轉(zhuǎn)換成float型)
強(qiáng)迫類型轉(zhuǎn)換的1般情勢為:
(類型名)(表達(dá)式)
注意:如果要進(jìn)行強(qiáng)迫類型轉(zhuǎn)換的對象是1個變量,該變量可以不用括號括起來。如果要進(jìn)行強(qiáng)迫類型轉(zhuǎn)換的對象是1個包括多項的表達(dá)式,則表達(dá)式應(yīng)當(dāng)用括號括起來。如果寫成
(int)x+y
則只將x轉(zhuǎn)換成整型,然后與y相加。
以上強(qiáng)迫類型轉(zhuǎn)換的情勢是原來C語言使用的情勢,C++把它保存了下來,以利于兼容。C++還增加了以下情勢:
類型名(表達(dá)式)
如
int(x)
或
int(x+y)
類型名不加括號,而變量或表達(dá)式用括號括起來。這類情勢類似于函數(shù)調(diào)用。但許多人仍習(xí)慣于用第1種情勢,把類型名包在括號內(nèi),這樣比較清楚。
需要說明的是在強(qiáng)迫類型轉(zhuǎn)換時,得到1個所需類型的中間變量,但原來變量的類型未產(chǎn)生變化。例如:
(int)x
如果x原指定為float型,值為3.6,進(jìn)行強(qiáng)迫類型運(yùn)算后得到1個int型的中間變量,它的值等于3,而x原來的類型和值都不變。
【例2.4】強(qiáng)迫類型轉(zhuǎn)換。
#include <iostream>
using namespace std;
int main( )
{
float x;
int i;
x=3.6;
i=(int)x;
cout<<"x="<<x<<",i="<< i<<endl;
return 0;
}
運(yùn)行結(jié)果以下:
x=3.6,i=3
x的型仍為float型,值仍等于3.6。
由上可知,有兩種類型轉(zhuǎn)換,1種是在運(yùn)算時沒必要用戶指定,系統(tǒng)自動進(jìn)行的類型轉(zhuǎn)換,如3+6.5。第2種是強(qiáng)迫類型轉(zhuǎn)換。當(dāng)自動類型轉(zhuǎn)換不能實現(xiàn)目的時,可以用強(qiáng)迫類型轉(zhuǎn)換。另外,在函數(shù)調(diào)用時,有時為了使實參與形參類型1致,可以用強(qiáng)迫類型轉(zhuǎn)換運(yùn)算符得到1個所需類型的參數(shù)。
C++賦值運(yùn)算符與賦值表達(dá)式
賦值運(yùn)算符
賦值符號“=”就是賦值運(yùn)算符,它的作用是將1個數(shù)據(jù)賦給1個變量。如“a=3”的作用是履行1次賦值操作(或稱賦值運(yùn)算)。把常量3賦給變量a。也能夠?qū)?個表達(dá)式的值賦給1個變量。
賦值進(jìn)程中的類型轉(zhuǎn)換
如果賦值運(yùn)算符兩側(cè)的類型不1致,但都是數(shù)值型或字符型時,在賦值時會自動進(jìn)行類型轉(zhuǎn)換。
1) 將浮點型數(shù)據(jù)(包括單、雙精度)賦給整型變量時,舍棄其小數(shù)部份。
2) 將整型數(shù)據(jù)賦給浮點型變量時,數(shù)值不變,但以指數(shù)情勢存儲到變量中。
3) 將1個double型數(shù)據(jù)賦給float變量時,要注意數(shù)值范圍不能溢出。
4) 字符型數(shù)據(jù)賦給整型變量,將字符的ASCII碼賦給整型變量。
5) 將1個int、short或long型數(shù)據(jù)賦給1個char型變量,只將其低8位原封不動地送到char型變量(產(chǎn)生截斷)。例如
short int i=289;
char c;
c=i; //將1個int型數(shù)據(jù)賦給1個char型變量
賦值情況見圖2.8。為方便起見,以1個int型數(shù)據(jù)占兩個字節(jié)(16位)的情況來講明。

圖2.8
6) 將signed(有符號)型數(shù)據(jù)賦給長度相同的unsigned(無符號)型變量,將存儲單元內(nèi)容原樣照搬(連原本的符號位也作為數(shù)值1起傳送)。
<
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
------分隔線----------------------------
------分隔線----------------------------