今天给大家介绍逻辑运算符的短路求值,主要涉及逻辑与运算符($$ )和逻辑或运算符(|| )。
1.基本概念
短路求值是指$$ 和|| 都是先求左侧运算对象的值,当左侧运算对象的值无法确定表达式的结果时才计算右侧运算对象的值。
具体表现形式如下:
(1)对于$$ ,当且仅当左侧运算对象为真时才对右侧运算对象求值。
当左侧运算对象为假时,该表达式的运算结果可以确定为false ,因此无需计算右侧运算对象的值;当左侧运算对象为真时,右侧运算对象的值决定了该表达式的值。
(2)对于|| ,当且仅当左侧运算对象为假时才对右侧运算对象求值。
当左侧运算对象为真时,该表达式的运算结果可以确定为true ,因此无需计算右侧运算对象的值;当左侧运算对象为假时,右侧运算对象的值决定了该表达式的值。
2.应用场景
下面的代码将字符串中的字符依次从“小写”变为“大写”,直到处理完全部字符或遇到空格。
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string s1("some string");
for(auto i = 0; i != s1.size() && !isspace(s1[i]); i++)
s1[i] = toupper(s1[i]);
cout << s1 << endl;
}
运行上述代码,输出结果为:
SOME string
关键语句为第10行中的for 循环。当未读到字符串末尾时,i != s1.size() 为真,因此会继续计算$$ 右侧的!isspace(s1[i]) 判断是否遇到了空格;当读到字符串末尾时,i != s1.size() 为假,依据上文提到的短路求值策略,不会运行$$ 右侧的!isspace(s1[i]) 语句,避免了内存越界现象的发生,此时若执行!isspace(s1[i]) 语句会导致内存越界错误。
参考资料:
《C++ Primer》第5版
|