與C一樣,C++使用布爾表達式簡化求值法(short-circuit evaluation)。這表示一旦確定了布爾表達式的真假值,即使還有部分表達式沒有被測試,布爾表達式也停止運算。例如:
char *p;
...
if ((p != 0) && (strlen(p) > 10)) ...
這裡不用擔心當p為空時strlen無法正確運行,因為如果p不等於0的測試失敗,strlen不會被調用。同樣:
int rangeCheck(int index)
{
if ((index < lowerBound) || (index > upperBound)) ...
...
}
如果index小於lowerBound,它不會與upperBound進行比較。
很早以前上述行為特性就被反復灌輸給C和C++的程序員,所以他們都知道該特性。而且他們也依賴於簡短求值法來寫程序。例如在上述第一個代碼中,當p為空指針時確保strlen不會被調用是很重要的,因為C++標准說(正如C標准所說)用空指針調用strlen,結果不確定。
C++允許根據用戶定義的類型,來定制&&和||操作符。方法是重載函數operator&& 和operator||,你能在全局重載或每個類裡重載。然而如果你想使用這種方法,你必須知道你正在極大地改變游戲規則。因為你以函數調用法替代了簡短計算法。也就是說如果你重載了操作符&&,對於你來說代碼是這樣的:
if (expression1 && expression2) ...
對於編譯器來說,等同於下面代碼之一:
if (expression1.operator&&(expression2)) ...
// when operator&& is a
// member function
if (operator&&(expression1, expression2)) ...
// when operator&& is a
// global function
這好像沒有什麼不同,但是函數調用法與簡短求值法是絕對不同的。首先當函數被調用時,需要運算其所有參數,所以調用函數functions operator&& 和 operator||時,兩個參數都需要計算,換言之,沒有采用簡短計算法。第二是C++語言規范沒有定義函數參數的計算順序,所以沒有辦法知道表達式1與表達式2哪一個先計算。完全與具有從左參數到右參數計算順序的簡短計算法相反。