与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哪一个先计较。完全与具有从左参数到右参数计较顺序的简短计较法相反。