運算符和表達式

C++編程入門系列之五(運算符和表達式)

有些運算符需要兩個操作數,使用形式爲:操作數 運算符 操作數,這樣的運算符就叫做二元運算符或雙目運算符,只需要一個操作數的運算符叫做一元運算符或單目運算符。運算符具有優先級和結合性。如果一個表達式中有多個運算符則先進行優先級高的運算,後進行優先級低的運算。結合性就是指當一個操作數左邊和右邊的運算符優先級相同時按什麼樣的順序進行運算,是自左向右還是自右向左,下面會具體講到。雞啄米來詳細介紹幾種類型的運算符和表達式。

1.算術運算符和算術表達式

算術運算符包括基本算術運算符和自增自減運算符。由算術運算符、操作數和括號組成的表達式稱爲算術表達式。基本算術運算符有:+(加),-(減或負號),*(乘),/(除),%(求餘)。

“%”是求餘運算,它的操作數必須是整數,比如a%b是要計算a除以b後的餘數,它的優先級與”/”相同,這裏要注意的是,”/”用於兩個整數相除時,結果含有小數的話小數部分會舍掉,比如2/3的結果是0。

C++的自增運算符”++”和自減運算符”–”都是一元運算符,這兩個運算符都有前置和後置兩種形式,比如i++是後置,–j是前置。無論是前置還是後置都是將操作數的值增1或減1後再存到操作數內存中的位置。如果i的原值是2,則i++這個表達式的結果是2,i的值則變爲3,。如果j的原值也是2,則–j這個表達式的結果是1,j的值也變爲1。自增或自減表達式包含到更復雜的表達式中時,比如假設i的原值是1,cout<

賦值運算符和賦值表達式

最簡單的賦值運算符就是”=”,帶有賦值運算符的表達式被稱爲賦值表達式。例如n=n+2就是一個賦值表達式,賦值表達式的作用就是把等號右邊表達式的值賦給等號左邊的對象。賦值表達式的類型是等號左邊對象的類型,它的結果值也是等號左邊對象被賦值後的值,賦值運算符的結合性是自右向左。什麼叫自右向左呢?請看這個例子:a=b=c=1這個表達式會先從右邊算起,即先算c=1,c的值變爲1這個表達式的值也是1,然後這個表達式就變成了a=b=1,再計算b=1,同樣b也變爲1,b=1這個表達式的值也變成1,所以a也就變成了1。

除了”=”外,賦值運算符還有+=,-=,=,/=,%=,<<=,>>=,&=,^=,|=。其中前五個是賦值運算符和算術運算符組成的,後五個是賦值運算符和位運算符組成的,這幾個賦值運算符的優先級跟”=”相同,結合性也是自右向左。雞啄米舉幾個例子說明下,a+=5就等價於a=a+5,x=y+3等價於x=x*(y+3)。

逗號運算符和逗號表達式

逗號也是一個運算符,它的使用形式爲:表達式1,表達式2。求這個表達式的值就要先解表達式1,然後解表達式2,最終這個逗號表達式的值是表達式2的值。比如計算a=1*2,a+3,應先計算a=1*2,結果爲2,再計算a+3的值,a的值已經變成了2,再加上3爲5,這個逗號表達式的最終結果就是5。

邏輯運算和邏輯表達式

C++中提供了用於比較的關係運算符和用於邏輯分析的邏輯運算符。

關係運算符 包括<(小於)、<=(小於等於)、>(大於)、>=(大於等於)、==(等於)、!=(不等於)。前四個的優先級相同,後兩個的優先級相同,而且前四個比後兩個的優先級高。用關係運算符把兩個表達式連起來就是關係表達式,關係表達式的結果類型爲bool,值只能是true或false。比如,a>b,a大於b時表達式a>b表達式的值是true,否則就是false。更復雜的表達式也算是一個道理。

邏輯運算符包括!(非)、&&(與)、||(或),優先級依次降低。用邏輯運算符將關係表達式連起來就是邏輯表達式,邏輯表達式的結果也是bool類型,值也只能是true或false。”!”是一元運算符,使用形式是!操作數。非運算是對操作數取反。比如!a,a的值是true,則!a的值是false。”&&”是二元運算符,用來求兩個操作數的邏輯與,只有兩個操作數的值都是true,邏輯與的結果纔是true,其他情況下結果都是false。”||”也是二元運算符,用來求兩個操作數的邏輯或,只有兩個操作數的值都是false時,邏輯或的結果纔是false,其他情況下結果都是true。比如,int a=3,b=5,c=2,d=1; 則邏輯表達式(a>b)&&(c>d)的值爲false。

條件運算符和條件表達式

C++中唯一的一個三元運算符是條件運算符”?”。條件表達式的使用形式是:表達式1?表達式2:表達式3。表達式1是bool類型的,表達式2,3可以是任何類型,並且類型可以不同。條件表達式的類型是表達式2和3中較高的類型,類型的高低後面介紹。條件表達式會先解表達式1,如果表達式1的值是true,則解表達式2,表達式2的值就是條件表達式的值,而如果表達式1的值是false,則解表達式3,其值就是條件表達式的最終結果。比如:a>b? a=5:a=6;若a>b 則給a賦值爲5,否則爲6

sizeof運算符

sizeof運算符用來計算某個對象在內存中佔用的字節數。此運算符的使用形式爲:sizeof(類型名)或sizeof(表達式)。計算結果是這個類型或者這個表達式結果在內存中佔的字節數。

位運算

(1)按位與(&)。它是對兩個操作數的二進制形式的每一位分別進行邏輯與操作。比如3的二進制形式爲00000011,5的二進制形式爲00000101,按位與後結果是00000001。

(2)按位或(|)。它對兩個操作數的二進制形式的每一位分別進行邏輯或操作。還是比如3和5按位或運算後結果是00000111。

(3)按位異或(^)。它對兩個操作數的每一位進行異或,也就是如果對應位相同則運算結果爲0,若對應位不同則計算結果爲1。例如3和5按位異或後結果爲00000110。

(4)按位取反(~)。這是一個一元運算符。它對一個二進制數的每一位求反。比如,3按位取反就是11111100。

(5)移位。包括左移運算(<<)和右移運算(>>),都是二元運算符。移位運算符左邊的數是需要移位的數值,右邊的數是移動的位數。左移是按指定的位數將一個數的二進制值向左移位,左移後,低位補0,移出的高位捨棄。右移是按照指定的位數將一個數的二進制值向右移位,右移後,移出的低位捨棄,如果是無符號數則高位補0,如果是有符號數,則高位補符號位或0,一般補符號位。比如,char型變量的值是-8,則它在內存中的二進制補碼值是11111000,所以a>>2則需要將最右邊兩個0移出,最左邊補兩個1,因爲符號位是1,則結果爲11111110,對其再求補碼就得到最終結果-2。

混合運算時數據類型的轉換

表達式中的類型轉換分爲:隱含轉換和強制轉換。

在算術運算和關係運算中如果參與運算的操作數類型不一樣,則系統會對其進行類型轉換,這是隱含轉換,轉換的原則就是將低類型的數據轉換爲高類型數據。各類型從低到高依次爲char,short,int,unsigned int,long,unsigned long,float,double。類型越高範圍越大,精度也越高。隱含轉換是安全的,因爲沒有精度損失。邏輯運算符的操作數必須是bool型,如果不是就需要將其轉換爲bool型,非0數據轉換爲true,0轉換爲false。位運算操作數必須是整數,如果不是也會自動進行類型轉換,也是低類型數據轉換爲高類型數據。賦值運算要求賦值運算符左邊的值和右邊的值類型相同,不同的話也要進行自動轉換,但這個時候不會遵從上面的原則而是一律將右值轉換爲左值的類型。比如,int iVal; float fVal; double dVal;則dVal=iVal*fVal;計算時先將iVal轉換爲跟fVal一樣的float型,乘法的結果再轉換爲double型。

強制類型轉換是由類型說明符和括號來實現的,使用形式爲:類型說明符(表達式) 或 (類型說明符)表達式。它是將表達式的結果類型強制轉換爲類型說明符指定的類型。比如,float fVal=1.2; int iVal = (int)fVal;計算後面表達式的值時會將1.2強制轉換成1,捨棄小數部分。

思考:

1. 運用%和/運算符需要注意什麼?
2. 什麼是逗號表達式,如何使用
3. 什麼是條件表達式,具體形式是什麼?
4. 位運算的補位規則是什麼?
5. 什麼是類型轉換,需要注意什麼?強制轉換和自動轉換的區別?

以上轉自雞啄米課堂,並做相應的修改~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章