上面將生成一條讀取內(nèi)存的語句,即使從內(nèi)存中讀出來的數(shù)字沒有任何應(yīng)用(當(dāng)然,假如編譯器開了優(yōu)化選項,則上面的語句將不會生成任何代碼)。從這一點(diǎn)以及上面的c = a / b * 120.4f;語句中,都可以看出一點(diǎn)——變量是可以返回數(shù)字的而變量返回的數(shù)字就是按照變量的類型來解釋變量對應(yīng)內(nèi)存中的內(nèi)容所得到的數(shù)字。這句話也許不是那么輕易理解,在看過后面的類型轉(zhuǎn)換一節(jié)后應(yīng)該就可以理解了。
因此為了將數(shù)據(jù)寫入一塊內(nèi)存,使用賦值語句(即等號);要讀取一塊內(nèi)存,書寫標(biāo)識內(nèi)存的變量名。所以就可以這樣書寫:a = a + 3;
而如上的float a;語句,當(dāng)還未對變量進(jìn)行任何賦值操作時,a的值是什么?上帝才知道。當(dāng)時的a的內(nèi)容是什么(對于VC編譯器,在開啟了調(diào)試選項時,將會用0xCCCCCCCC填充這些未初始化內(nèi)存),就用IEEE的real*4格式來解釋它并得到相應(yīng)的一個數(shù)字,也就是a的值。因此應(yīng)在變量定義的時候就進(jìn)行賦值(但是會有性能上的影響,不過很小),以初始化變量而防止出現(xiàn)莫名其妙的值,如:float a = 0.0f;。
賦值操作符
上面的a = a + 3;的意思就是讓a的值增加3。在C++中,對于這種情況給出了一種簡寫方案,即前面的語句可以寫成:a += 3;。應(yīng)當(dāng)注重這兩條語句從邏輯上講都是使變量a的值增3,但是它們實際是有區(qū)別的,后者可以被編譯成優(yōu)化的代碼,因為其意思是使某一塊內(nèi)存的值增加一定數(shù)量,而前者是將一個數(shù)字寫入到某塊內(nèi)存中。所以假如可能,應(yīng)盡量使用后者,即a += 3;。這種語句可以讓編譯器進(jìn)行一定的優(yōu)化(但由于現(xiàn)在的編譯器都非常智能,能夠發(fā)現(xiàn)a = a + 3;是對一塊內(nèi)存的增值操作而不是一塊內(nèi)存的賦值操作,因此上面兩條語句實際上可以認(rèn)為完全相同,僅僅只具有簡寫的功能了)。
對于上面的情況,也可以應(yīng)用在減法、乘法等二元非邏輯操作符(不是邏輯值操作符,即不能a &&= 3;)上,如:a *= 3; a -= 4; a = 34; a >>= 3;等。
除了上面的簡寫外,C++還提供了一種簡寫方式,即a++;,其邏輯上等同于a += 1;。同上,在電腦編程中,加一和減一是經(jīng)常用到的,因此CPU專門提供了兩條指令來進(jìn)行加一和減一操作(轉(zhuǎn)成匯編語言就是Inc和Dec),但速度比直接通過加法或減法指令來執(zhí)行要快得多。為此C++中也就提供了“++”和“—”操作符來對應(yīng)Inc和Dec。所以a++;雖然邏輯上和a = a + 1;等效,實際由于編譯器可能做出的優(yōu)化處理而不同,但還是如上,由于編譯器的智能化,其是有可能看出a = a + 1;可以編譯成Inc指令進(jìn)而即使沒有使用a++;卻也依然可以得到優(yōu)化的代碼,這樣a++;將只剩下簡寫的意義而已。
注重前面之所以會朝好的方向發(fā)展(即char轉(zhuǎn)成float),完全是因為“==”的緣故,其要求這么做。下面考慮“=”:short b = 3543; char a = b;。因為b的值是short類型,而“=”的要求就是一定要將“=”右邊的數(shù)字轉(zhuǎn)成和左邊一樣,這樣才能進(jìn)行正確的內(nèi)存的寫入(簡單地將右邊數(shù)字返回的二進(jìn)制數(shù)復(fù)制到左邊的地址所表示的內(nèi)存中)。因此a將為-41。但是上面是編譯器按照“=”的要求自行進(jìn)行了隱式轉(zhuǎn)換,可能是由于程序員的疏忽而沒有發(fā)現(xiàn)這個錯誤(以為b的值一定在-128到127的范圍內(nèi)),因此編譯器將對上面的情況給出一個警告,說b的值可能被截斷。為了消除編譯器的疑慮,如下:char a = ( char )b;。這樣稱為顯示類型轉(zhuǎn)換,其告訴編譯器——“我知道可能發(fā)生數(shù)據(jù)截斷,但是我保證不會截斷”。因此編譯器將不再發(fā)出警告。但是如下:char a = ( char )3543;,由于編譯器可以肯定3543一定會被截斷而導(dǎo)致錯誤的返回值,因此編譯器將給出警告,說明3543將被截斷,而不管前面的類型轉(zhuǎn)換操作符是否存在。
現(xiàn)在應(yīng)該可以推出——15 + 15.0f;返回的是一個float類型的數(shù)字。因此假如如下:char a = 15 + 15.0f;,編譯器將發(fā)出警告,說數(shù)據(jù)可能被截斷。因此改成如下:char a = ( char )15 + 15.0f;,但類型轉(zhuǎn)換操作符“()”的優(yōu)先級比“+”高,結(jié)果就是15先被轉(zhuǎn)換為char然后再由于“+”的要求而被隱式轉(zhuǎn)成float,最后返回float給“=”而導(dǎo)致編譯器依舊發(fā)出警告。為此,就需要提高“+”的優(yōu)先級,如下:char a = ( char )( 15 + 15.0f );就沒事了(或char( 15 + 15.0f )),其表示我保證15 + 15.0f不會導(dǎo)致數(shù)據(jù)截斷。