1.6.4 遞增運算符與遞減運算符
接下來,程序使用遞增運算符(++)使變量的值增加1。使用該運算符將變量lives的值增加了兩次。第一次如下面一行:
++lives;
第二次如下面一行:
lives++;
這兩行的最終效果是一樣的:將lives的值從3增加到4。
正如代碼所示,我們可以將運算符置于需要增加的變量之前或之后。如果放在變量之前,運算符稱為前置遞增運算符;如果放在變量之后,則稱為后置遞增運算符。
現(xiàn)在您也許會認為前置和后置版本沒有區(qū)別,但實際上不是這樣。在只需要單個變量進行遞增的情況下(如之前的代碼),兩個運算符的最終結(jié)果一樣。但是在更加復雜的表達式中,結(jié)果可能會不同。
為了演示這種重要的區(qū)別,程序在每關(guān)游戲結(jié)束時進行了一次適當?shù)挠嬎恪3绦蚧谕婕业纳鼣?shù)計算獎勵,而且會增加玩家的生命數(shù)。然而,程序使用了兩種不同的方式進行這種計算。第一次使用前置遞增運算符。
int bonus = ++lives * 10;
前置遞增運算符會在較大的表達式使用變量之前增加變量的值。++lives * 10首先將lives值增加,然后再將增加結(jié)果乘以10。因此,代碼與4 * 10的結(jié)果40相等。這意味著最后lives的值為4,bonus的值為40。
將lives的值置回3后,程序再次計算了bonus。這次使用的是后置遞增運算符。
bonus = lives++ * 10;
后置遞增運算符會在較大的表達式使用變量之后增加變量的值。lives++ * 10的結(jié)果是lives的當前值乘以10。因此,代碼與3 * 10的結(jié)果30相等。經(jīng)過本次計算后,lives的值被遞增。執(zhí)行完該行代碼后,lives的值是4,bonus的值是30。
C++還定義了遞減運算符,--。它除了對變量進行遞減外,其他和遞增運算符一樣。遞減運算符也包含了兩種版本(前置和后置)。
1.6.5 整數(shù)的溢出處理
當把整數(shù)變量的值增加到超過它能表示的最大值時會怎樣?結(jié)果并不會產(chǎn)生錯誤,然而,這會“溢出”到類型能表示的最小值。接下來,程序要演示這種現(xiàn)象。首先,給score變量賦上它能存儲的最大值。
score = 4294967295;
然后對變量做遞增操作。
++score;
結(jié)果是score變成0。其原因在于值溢出,和汽車的里程表在超過最大值時的情況非常類似(如圖1-7所示)。
對整數(shù)變量遞減超出它的最小值時會“溢出”到最大值。