官术网_书友最值得收藏!

1.3 運(yùn)算符和表達(dá)式

和其他程序設(shè)計語言一樣,C++記述運(yùn)算的符號稱為“運(yùn)算符”,運(yùn)算符的運(yùn)算對象稱為“操作數(shù)”。對一個操作數(shù)運(yùn)算的運(yùn)算符稱為“單目運(yùn)算符”或稱為“一元運(yùn)算符”,如-a、-i;對兩個操作數(shù)運(yùn)算的運(yùn)算符稱為“雙目(二元)運(yùn)算符”,如3+5;對三個操作數(shù)運(yùn)算的運(yùn)算符稱為“三目(三元)運(yùn)算符”,如x?a:b。而表達(dá)式是由變量、常量(操作數(shù))通過一個或多個運(yùn)算符組合而成的,一個合法的C++表達(dá)式經(jīng)過計算應(yīng)有一個確定的值和類型。不同的運(yùn)算符構(gòu)成的是不同的表達(dá)式,例如,由關(guān)系運(yùn)算符構(gòu)成的表達(dá)式稱為關(guān)系表達(dá)式,而由邏輯運(yùn)算符構(gòu)成的表達(dá)式稱為邏輯表達(dá)式,等等。本節(jié)重點(diǎn)介紹C++的常用運(yùn)算符。

1.3.1 算術(shù)運(yùn)算符

數(shù)學(xué)中,算術(shù)運(yùn)算包括加、減、乘、除、乘方及開方等。在C++中,算術(shù)運(yùn)算符可以實(shí)現(xiàn)這些數(shù)學(xué)運(yùn)算。但乘方和開方?jīng)]有專門的運(yùn)算符,它們一般通過pow(冪)、sqrt(平方根)等庫函數(shù)來實(shí)現(xiàn),這些庫函數(shù)是在頭文件math.h中定義的(見附錄C)。

由操作數(shù)和算術(shù)運(yùn)算符構(gòu)成的算術(shù)表達(dá)式常用于數(shù)值運(yùn)算,與數(shù)學(xué)中的代數(shù)表達(dá)式相對應(yīng)。C++算術(shù)運(yùn)算符有雙目的加減乘除四則運(yùn)算符、求余運(yùn)算符及單目的正負(fù)運(yùn)算符,如下所示:

+     正號運(yùn)算符,如+4,+1.22等
-     負(fù)號運(yùn)算符,如-4,-1.22等
*     乘法運(yùn)算符,如6*8,1.4*3.56等
/     除法運(yùn)算符,如6/8,1.4/3.56等
%     模運(yùn)算符或求余運(yùn)算符,如40%11等
+     加法運(yùn)算符,如6+8,1.4+3.56等
-     減法運(yùn)算符,如6-8,1.4-3.56等

C++中算術(shù)運(yùn)算符和數(shù)學(xué)運(yùn)算的概念及運(yùn)算方法是一致的,但要注意以下幾點(diǎn)。

(1)除法運(yùn)算。兩個整數(shù)相除,結(jié)果為整數(shù),如7/5的結(jié)果為1,它是將小數(shù)部分去掉,而不是四舍五入;若除數(shù)和被除數(shù)中有一個是實(shí)數(shù),則進(jìn)行實(shí)數(shù)除法,結(jié)果是實(shí)型。如7/5.0,7.0/5,7.0/5.0的結(jié)果都是1.4。

(2)求余運(yùn)算。求余運(yùn)算要求參與運(yùn)算的兩個操作數(shù)都是整型,其結(jié)果是兩個數(shù)相除的余數(shù)。例如40%5的結(jié)果是0,40%11的結(jié)果是7。要理解負(fù)值的求余運(yùn)算,例如40%-11的結(jié)果是7,-40%11的結(jié)果是-7,-40%-11的結(jié)果也是-7。

(3)優(yōu)先級和結(jié)合性。在一個包含多種算術(shù)運(yùn)算的混合運(yùn)算中,先乘、除后加、減的運(yùn)算規(guī)則是由運(yùn)算符的優(yōu)先級來保證的。在算術(shù)運(yùn)算符中,單目的正負(fù)運(yùn)算符的優(yōu)先級最高,其次是乘、除和求余,最后是加、減。優(yōu)先級相同的運(yùn)算符,則按它們的結(jié)合性進(jìn)行處理。所謂運(yùn)算符的結(jié)合性是指運(yùn)算符和操作數(shù)的結(jié)合方式,它有“從左至右”和“從右至左”兩種?!皬淖笾劣业慕Y(jié)合”是指運(yùn)算符左邊的操作數(shù)先與運(yùn)算符相結(jié)合,再與運(yùn)算符右邊的操作數(shù)進(jìn)行運(yùn)算,如3*5/4的次序是先乘后除;而自右至左的結(jié)合次序剛好相反,它是將運(yùn)算符右邊的操作數(shù)先與運(yùn)算符相結(jié)合。在算術(shù)運(yùn)算符中,除單目運(yùn)算符外,其余運(yùn)算符的結(jié)合性都是從左至右。

(4)書寫格式。在使用運(yùn)算符進(jìn)行數(shù)值運(yùn)算時,若書寫時沒有在雙目運(yùn)算符兩邊加上空格,則有時編譯系統(tǒng)會做出與自己想象中不同的理解。例如:

結(jié)果是不一樣的,前者發(fā)生編譯錯誤,而后者的結(jié)果是37。

為了避免上述情況的發(fā)生,在書寫時,應(yīng)有意識地加上一些括號。這樣不僅可增強(qiáng)程序的可讀性,而且,尤其當(dāng)對優(yōu)先關(guān)系猶豫時,加上括號是保證正確結(jié)果的最好方法。

(5)溢出處理。在C++中,當(dāng)某數(shù)除以0或當(dāng)其他數(shù)值溢出時,編譯系統(tǒng)將報告錯誤并終止程序運(yùn)行。但對整數(shù)超過類型范圍溢出時,系統(tǒng)卻不認(rèn)為是一個錯誤,這在編程時需要特別小心。

例Ex_OverFlow】 一個整數(shù)溢出的例子

#include <iostream.h>
int  main()
{
    short  nTotal,nNum1,nNum2;
    nNum1 = nNum2 = 1000;
    nTotal = nNum1*nNum2;
    cout<<nTotal<<"\n";
    return 0;
}

程序運(yùn)行后,顯示的結(jié)果是16960。 這個結(jié)果與想象中的1000000相差太遠(yuǎn)。這是因?yàn)椋魏巫兞康闹翟谟嬎銠C(jī)內(nèi)部都是以二進(jìn)制存儲的,nNum1*nNum2的1000000結(jié)果很顯然超過了短整型數(shù)的最大值32767,將1000000放入nTotal中,就必然產(chǎn)生高位溢出,也就是說,1000000的二進(jìn)制數(shù)(11110100001001000000)2中只有后面16位的(0100001001000000)2有效,結(jié)果是十進(jìn)制的16960。這個問題可通過改變變量的類型來解決,如將類型定義成整型(int)或長整型(long)。

1.3.2 賦值運(yùn)算符

前面已經(jīng)多次遇到過賦值操作的示例。在C++中,賦值運(yùn)算是使用賦值符“=”來操作的,它是一個使用最多的雙目運(yùn)算符,結(jié)合性從右到左,其作用是將賦值符右邊操作數(shù)的值存儲到左邊的操作數(shù)所在的內(nèi)存空間中,顯然,左邊的操作數(shù)應(yīng)是一個具有存儲空間的變量。

需要說明的是,每一個合法的表達(dá)式在求值后都有一個確定的值和類型。賦值表達(dá)式的值和類型就是賦值符左邊操作數(shù)的值和類型。例如double變量fTemp的賦值表達(dá)式“fTemp = 18”賦值完成后,該賦值表達(dá)式的類型是double,表達(dá)式的值經(jīng)類型轉(zhuǎn)換后變成18.0,這種轉(zhuǎn)換是類型自動轉(zhuǎn)換(后面還會討論到)。這里先來討論復(fù)合賦值與多重賦值的問題。

1.復(fù)合賦值

在C++中,規(guī)定了下列10種復(fù)合賦值運(yùn)算符:

它們都是在賦值符“=”之前加上其他運(yùn)算符而構(gòu)成的,其中的復(fù)合賦值運(yùn)算符的含義如表1.3所示,其他復(fù)合賦值運(yùn)算符的含義均與其相似。

表1.3 復(fù)合賦值運(yùn)算符

盡管復(fù)合賦值運(yùn)算符看起來有些古怪,但卻簡化了代碼,使程序精練,更主要的是在編譯時能產(chǎn)生高效的執(zhí)行代碼。需要說明的是:

(1)在復(fù)合賦值運(yùn)算符之間不能有空格,例如 += 不能寫成 += ,否則編譯時將提示出錯信息。

(2)復(fù)合運(yùn)算符的優(yōu)先級和賦值符的優(yōu)先級一樣,在C++的所有運(yùn)算符中只高于逗號運(yùn)算符,而且復(fù)合賦值運(yùn)算符的結(jié)合性也和賦值符一樣,也是從右至左。因此,在組成復(fù)雜的表達(dá)式時要特別小心。例如:

a *= b - 4/c + d

等效于

a = a * ( b - 4/c + d)

而不等效于

a = a * b - 4/c + d

2.多重賦值

所謂多重賦值是指在一個賦值表達(dá)式中出現(xiàn)兩個或更多的賦值符“=”。例如:

nNum1=nNum2=nNum3=100    // 若結(jié)尾有分號“;”,則表示是一條語句

由于賦值符的結(jié)合性是從右至左的,因此上述程序的賦值過程是這樣的:首先對賦值表達(dá)式nNum3 = 100求值,即將100賦值給nNum3,同時該賦值表達(dá)式的結(jié)果是nNum3,值為100;然后將nNum3的值賦給nNum2,這是第二個賦值表達(dá)式,該賦值表達(dá)式的結(jié)果是nNum2,值也為100;最后將nNum2的值賦給nNum1,整個表達(dá)式的結(jié)果是nNum1。

由于賦值是一個表達(dá)式,因而幾乎可以出現(xiàn)在程序的任何地方,由于賦值運(yùn)算符的等級比較低,因此這時的賦值表達(dá)式兩邊應(yīng)加上圓括號。例如:

a=7+(b=8)                  // 賦值表達(dá)式值為15,a值為15,b值為8
a=(c=7)+(b=8)              // 賦值表達(dá)式值為15,a值為15,c值為7,b值為8
(a=6)=(c=7)+(b=8)          // 賦值表達(dá)式值為15,a值為15,c值為7,b值為8

要注意上面最后一個表達(dá)式的運(yùn)算次序:由于圓括號運(yùn)算符的優(yōu)先級在該表達(dá)式中是最高的,因此先運(yùn)算( a = 6 )、(c = 7)和( b = 8),究竟這三個表達(dá)式誰先運(yùn)算,取決于編譯系統(tǒng)。由于這三個表達(dá)式都是賦值表達(dá)式,其結(jié)果分別為a、c和b,因此整個表達(dá)式等效于a = c + b,結(jié)果為a=15、b=8、c=7,整個表達(dá)式的結(jié)果是a。

1.3.3 數(shù)據(jù)類型轉(zhuǎn)換

在進(jìn)行運(yùn)算時,往往要遇到混合數(shù)據(jù)類型的運(yùn)算問題。例如,一個整數(shù)和一個實(shí)數(shù)相加就是一個混合數(shù)據(jù)類型的運(yùn)算。C++采用兩種方法對數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,一種是自動轉(zhuǎn)換,另一種是強(qiáng)制轉(zhuǎn)換。

1.自動轉(zhuǎn)換

自動轉(zhuǎn)換是將數(shù)據(jù)類型按從低到高的順序自動進(jìn)行轉(zhuǎn)換,如圖1.6所示,箭頭的方向表示轉(zhuǎn)換的方向。由于這種轉(zhuǎn)換不會丟失有效的數(shù)據(jù)位,因而是安全的。

圖1.6 數(shù)據(jù)類型轉(zhuǎn)換的順序

例如,10 + 'a' + 2*1.25-5.0/4L的運(yùn)算次序如下:

(1)進(jìn)行2*1.25的運(yùn)算,將2和1.25都轉(zhuǎn)換成double型,結(jié)果為double型的2.5。

(2)進(jìn)行5.0/4L的運(yùn)算,將長整型4L和5.0都轉(zhuǎn)換成double型,結(jié)果值為1.25。

(3)進(jìn)行10 + 'a' 的運(yùn)算,先將'a'轉(zhuǎn)換成int型整數(shù)97,運(yùn)算結(jié)果為107。

(4)整數(shù)107和2.5相加,先將整數(shù)107轉(zhuǎn)換成double型,結(jié)果為double型,值為109.5。

(5)進(jìn)行109.5-1.25的運(yùn)算,結(jié)果為double型的108.25。

2.強(qiáng)制轉(zhuǎn)換

強(qiáng)制轉(zhuǎn)換是在程序中通過指定數(shù)據(jù)類型來改變?nèi)鐖D1.6所示的類型轉(zhuǎn)換順序,將一個變量從其定義的類型改變成為另一種不同的類型。由于這種轉(zhuǎn)換可能會丟失有效的數(shù)據(jù)位,因而是不安全的。在強(qiáng)制轉(zhuǎn)換操作時,C++有下列兩種基本格式:

(<類型名>)<表達(dá)式>
<類型名>(<表達(dá)式>)

這里的類型名是任何合法的C++數(shù)據(jù)類型,如float、int等。通過類型的強(qiáng)制轉(zhuǎn)換可以將表達(dá)式(含常量、變量等)轉(zhuǎn)換成類型名指定的類型,例如:

double  f=3.56;
int  nNum;
nNum=(int)f;                  // 強(qiáng)制double轉(zhuǎn)換成int,小數(shù)部分被截去

或者

nNum=int(f);                  // 或者nNum=(int)(f);

都是將nNum的值變?yōu)?。需要注意的是,當(dāng)對一個表達(dá)式進(jìn)行強(qiáng)制轉(zhuǎn)換時,需將表達(dá)式用圓括號括起來。例如,(int)(x+y)是將表達(dá)式(x+y)轉(zhuǎn)換為int型,若為(int)x+y,則是將x轉(zhuǎn)換為int型后再與y相加,表達(dá)式最后的類型是否是int型還取決于y數(shù)據(jù)類型。

1.3.4 關(guān)系運(yùn)算符

關(guān)系運(yùn)算是邏輯運(yùn)算中比較簡單的一種。所謂關(guān)系運(yùn)算實(shí)際上是比較兩個操作數(shù)是否符合給定的條件。在C++中,若符合條件,則關(guān)系表達(dá)式的值為bool型的true或非0(“真”),否則為bool型的false或0(“假”)。由于關(guān)系運(yùn)算需要兩個操作數(shù),所以關(guān)系運(yùn)算符都是雙目運(yùn)算符,其結(jié)合性是從左至右。C++提供了下列6種關(guān)系運(yùn)算符:

<            小于,       若表達(dá)式e1<e2成立,則結(jié)果為true,否則為false
<=           小于等于,   若表達(dá)式e1<=e2成立,則結(jié)果為true,否則為false
>            大于,       若表達(dá)式e1>e2成立,則結(jié)果為true,否則為false
>=           大于等于,   若表達(dá)式e1>=e2成立,則結(jié)果為true,否則為false
==           相等于,     若表達(dá)式e1==e2成立,則結(jié)果為true,否則為false
!=           不等于,     若表達(dá)式e1!=e2成立,則結(jié)果為true,否則為false

其中,前4種的優(yōu)先級相同且高于后面的兩種。例如,若有表達(dá)式:

a == b > c

則等效于a == ( b > c )。若設(shè)整型變量a=3、b=4、c=5,則表達(dá)式中,先運(yùn)算b>c,結(jié)果該條件不滿足,值為false(以0表示),然后再運(yùn)算a==0,顯然也為false,故整個表達(dá)式的值是false。

要注意混合表達(dá)式的運(yùn)算次序和結(jié)果。由于true或false可以看成0或1的整數(shù),因此關(guān)系表達(dá)式可以參與算術(shù)運(yùn)算,此時要注意關(guān)系運(yùn)算符的優(yōu)先級低于算術(shù)運(yùn)算符。例如“2+3<4-1”先計算“2+3”和“4-1”,即為“5<3”,結(jié)果為false。若為“2+(3<4)-1”則有“2+0-1”,結(jié)果為值1。

1.3.5 邏輯運(yùn)算符

關(guān)系運(yùn)算符所構(gòu)成的條件一般比較簡單,當(dāng)需要滿足多個條件時,則需使用邏輯運(yùn)算符。例如,對于數(shù)學(xué)中的“a<c<b”,則相應(yīng)的C++表達(dá)式可寫成“(a<c)&&(c<b)”,其中的“&&”就是一個C++邏輯運(yùn)算符。邏輯運(yùn)算符用于將多個關(guān)系表達(dá)式或邏輯量(“真”或“假”)組成一個邏輯表達(dá)式。同樣,邏輯表達(dá)式的結(jié)果也是bool型,要么為true,要么為false。

C++提供了下列3種邏輯運(yùn)算符:

!            邏輯非(單目)
&&           邏輯與(雙目)
||           邏輯或(雙目)

邏輯非“!”是指操作數(shù)為true結(jié)果為false,操作數(shù)為false結(jié)果為true。

邏輯與“&&”是指當(dāng)兩個操作數(shù)都是true時,結(jié)果才為true,否則為false。

邏輯或“||”是指當(dāng)兩個操作數(shù)中有一個是true時,結(jié)果就為true,而只有當(dāng)它們都為false時,結(jié)果才為false。

“邏輯非”、“邏輯與”和“邏輯或”的優(yōu)先級依次從高到低,且“邏輯非”的優(yōu)先級還比算術(shù)運(yùn)算符和關(guān)系運(yùn)算符高,而“邏輯與”和“邏輯或”的優(yōu)先級卻比關(guān)系運(yùn)算符要低。

需要說明的是,C++對運(yùn)算次序進(jìn)行了許多優(yōu)化。對于邏輯表達(dá)式來說,當(dāng)有e1&&e2時,若表達(dá)式e1為0,則表達(dá)式e2不會計算,因?yàn)闊o論e2是何值,整個表達(dá)式都為false;類似的,當(dāng)有e1||e2時,若e1為1,則e2也不會計算,因?yàn)闊o論e2是何值,整個表達(dá)式都為true。

例如,若int a, b = 3, c = 0; 則在下面的表達(dá)式中

(a=0)&&(c=a+b);           // 注意這里的a=0是賦值表達(dá)式

因(a = 0)的表達(dá)式值為0(false),故(c = a + b)不會被執(zhí)行。這樣,a,b和c的值分別為0,3,0。

若有:

(a=2)||(c=a+b);             // 注意這里的a=2是賦值表達(dá)式

因(a = 2)的表達(dá)式值為2(true),故(c = a+b)也不會被執(zhí)行(注意此時的邏輯符為“或”)。

1.3.6 位運(yùn)算符

位運(yùn)算符對操作數(shù)按其在計算機(jī)內(nèi)表示的二制數(shù)逐位地進(jìn)行邏輯運(yùn)算或移位運(yùn)算,參與運(yùn)算的操作數(shù)只能是整型常量或整型變量。C++語言提供了6種位運(yùn)算符:

~           按位求反(單目)
&            按位與(雙目)
^            按位異或(雙目)
|            按位或(雙目)
<<           左移(雙目)
>>           右移(雙目)符

按位求反“~”是將一個二進(jìn)制數(shù)的每一位求反,即0變成1,1變成0。

按位與“&”是將兩個操作數(shù)對應(yīng)的每個二進(jìn)制位分別進(jìn)行邏輯與操作。

按位或“|”是將兩個操作數(shù)對應(yīng)的每個二進(jìn)制位分別進(jìn)行邏輯或操作。

按位異或“^”是將兩個操作數(shù)對應(yīng)的每個二進(jìn)制位分別進(jìn)行異或操作,相同為0,不同為1。

左移“<<”(兩個<符號連寫)是將左操作數(shù)的二進(jìn)制值向左移動指定的位數(shù),它具有下列格式:

操作數(shù)<<移位的位數(shù)

左移后,低位補(bǔ)0,移出的高位舍棄。例如,表達(dá)式4<<2的結(jié)果是16(二進(jìn)制為00010000),其中4是操作數(shù),二進(jìn)制為00000100,2是左移的位數(shù)。

右移“>>”(兩個>符號連寫)是將左操作數(shù)的二進(jìn)制值向右移動指定的位數(shù),它的操作格式與“左移”相似,即具有下列格式:

操作數(shù)>>移位的位數(shù)

右移后,移出的低位舍棄。如果是無符號數(shù)則高位補(bǔ)0;如果是有符號數(shù),則高位補(bǔ)符號位(補(bǔ)1)或補(bǔ)0,不同的編譯系統(tǒng)對此有不同的處理方法,Visual C++ 6.0采用的是補(bǔ)符號位(補(bǔ)1)的方法。

需要說明的是,由于左移和右移運(yùn)算速度比較快,因此在許多場合下用來替代乘和除以2的n次方運(yùn)算,n為移位的位數(shù)。

1.3.7 條件運(yùn)算符

條件運(yùn)算符“?:”是C++中唯一的一個三目運(yùn)算符,它具有下列格式:

<e1>?<e2> :<e3>

表達(dá)式e1、表達(dá)式e2和表達(dá)式e3是條件運(yùn)算符“?:”的三個操作數(shù)。其中,表達(dá)式e1是C++中可以產(chǎn)生true和false結(jié)果的任何表達(dá)式。其功能是:如果表達(dá)式e1的結(jié)果為true,則執(zhí)行表達(dá)式e2,否則執(zhí)行表達(dá)式e3。例如:

nNum = (a > b) ? 10 : 8;

當(dāng)(a > b)為true時,則表達(dá)式(a > b) ? 10 : 8的結(jié)果為10,從而nNum = 10;否則(a > b) ? 10 :8的結(jié)果為8,nNum = 8。

需要說明的是,由于條件運(yùn)算符“?:”的優(yōu)先級比較低,僅高于賦值運(yùn)算符,因此“nNum =(a > b) ? 10 : 8”中的條件表達(dá)式“(a > b)”兩邊可以不加圓括號,即可寫成:

nNum = a > b ? 10 : 8;

1.3.8 sizeof運(yùn)算符

sizeof的目的是返回操作數(shù)所占的內(nèi)存空間大小(字節(jié)數(shù)),它具有下列兩種格式:

sizeof(<表達(dá)式>)
sizeof(<數(shù)據(jù)類型>)

例如:

sizeof("Hello")                      // 計算"Hello"所占內(nèi)存的字節(jié)大小,結(jié)果為6
sizeof(int)                          // 計算整型int所占內(nèi)存的字節(jié)數(shù)

需要說明的是,由于同一類型的操作數(shù)在不同的計算機(jī)中占用的存儲字節(jié)數(shù)可能不同,因此sizeof的結(jié)果有可能不一樣。例如sizeof(int)的值可能是4,也可能是2。

1.3.9 逗號運(yùn)算符

逗號運(yùn)算符“,”是優(yōu)先級最低的運(yùn)算符,它用于把多個表達(dá)式連接起來,構(gòu)成一個逗號表達(dá)式。逗號表達(dá)式的一般形式為:

表達(dá)式1,表達(dá)式2,表達(dá)式3,…,表達(dá)式n

在計算時,C++將從左至右逐個計算每個表達(dá)式,最終整個表達(dá)式的結(jié)果是最后計算的那個表達(dá)式的類型和值,即表達(dá)式n的類型和值。例如:

a=1,  b=a+2,  c=b+3

該表達(dá)式依次從左至右計算,最終的類型和值為最后一個表達(dá)式“c = b + 3”的類型和值,結(jié)果為左值c(c值為6)。

要注意逗號運(yùn)算符“,”的優(yōu)先級是最低的,必要時要注意加上圓括號,以使逗號表達(dá)式的運(yùn)算次序先于其他表達(dá)式。例如:

j = ( i = 12 , i + 8)

則整個表達(dá)式可解釋為一個賦值表達(dá)式。圓括號中,i = 12 , i + 8是逗號表達(dá)式,計算次序是先計算表達(dá)式i = 12,然后再計算i + 8。整個表達(dá)式的類型和值是j的類型和值(為20)。若不加上圓括號,則含義完全不一樣。試比較:

j = i = 12 , i + 8

顯然,此時整個表達(dá)式可解釋為是一個逗號表達(dá)式,最終的類型和值取決于i+8的類型和值。

1.3.10 自增和自減

單目運(yùn)算符自增(++)和自減(--)為變量加1或減1提供了一種非常有效的方法。++和--既可放在變量的左邊也可以出現(xiàn)在變量的右邊,分別稱為前綴運(yùn)算符和后綴運(yùn)算符。例如:

int  i=5;
i++;                            // 合法:后綴自增,等效于i=i+1; 或i+=1;
++i;                            // 合法:前綴自增,等效于i=i+1; 或i+=1;
i--;                            // 合法:后綴自減,等效于i=i-1; 或i-=1;
--i;                            // 合法:前綴自減,等效于i=i-1; 或i-=1;
 (i+1)++; 或++(i+1);             // 錯誤:表達(dá)式i+1結(jié)果不是一個變量
float  f1,f2=3.0f;
f1=f2++;                        // 合法:f1的值為3.0f,f2的值為4.0f
(f1=5.0f)++;                    // 合法:f1=5.0f 表達(dá)式的結(jié)果仍是f1,是一個變量

若前綴運(yùn)算符和后綴運(yùn)算符僅用于某個變量的增1和減1,則這兩者是等價的。例如,若a的初值為5,a++和++a都是使a變成6。但如果將這兩個運(yùn)算符和其他運(yùn)算符組合在一起,在求值次序上就會產(chǎn)生根本的不同。

● 如果用前綴運(yùn)算符對一個變量增1(減1),則在將該變量增1(減1)后,用新的值在表達(dá)式中進(jìn)行其他的運(yùn)算。

● 如果用后綴運(yùn)算符對一個變量增1(減1),則用該變量的原值在表達(dá)式中進(jìn)行其他的運(yùn)算后,再將該變量增1(減1)。例如:

a=5;    b=++a;                  //A:相當(dāng)于 a=a+1;  b=a;

a=5;    b=a++;                  //B:相當(dāng)于 b=a;  a=a+1;

運(yùn)行后,a值的結(jié)果都是6,但b的結(jié)果卻不一樣,前者(A)為6,后者(B)為5。

主站蜘蛛池模板: 松原市| 临湘市| 共和县| 宁武县| 宁武县| 南开区| 江门市| 丁青县| 周至县| 祥云县| 岳普湖县| 陕西省| 吐鲁番市| 乌苏市| 锡林浩特市| 漯河市| 湟中县| 英山县| 灵川县| 潮安县| 龙胜| 岳阳市| 独山县| 长岭县| 林州市| 股票| 双流县| 耿马| 开封县| 中阳县| 汉中市| 修水县| 三台县| 萨迦县| 榆中县| 元氏县| 邳州市| 洪泽县| 五指山市| 通州区| 泾川县|