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

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

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