- Visual C++實(shí)用教程
- 鄭阿奇編著
- 3253字
- 2018-12-30 12:04:26
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。
- TypeScript入門與實(shí)戰(zhàn)
- C和C++安全編碼(原書第2版)
- 數(shù)據(jù)結(jié)構(gòu)(Java語言描述)
- Java:Data Science Made Easy
- Cassandra Data Modeling and Analysis
- PostgreSQL 11從入門到精通(視頻教學(xué)版)
- 零基礎(chǔ)Java學(xué)習(xí)筆記
- 智能手機(jī)APP UI設(shè)計與應(yīng)用任務(wù)教程
- Java程序員面試筆試寶典(第2版)
- Raspberry Pi Robotic Projects(Third Edition)
- Android Game Programming by Example
- Less Web Development Cookbook
- JSP應(yīng)用與開發(fā)技術(shù)(第3版)
- C語言進(jìn)階:重點(diǎn)、難點(diǎn)與疑點(diǎn)解析
- R High Performance Programming