<返回更多

C++“短路求值”与“贪心法则”

2019-05-08    
加入收藏

1 “短路求值”

逻辑与、逻辑或操作符在使用时,总是先计算它的左操作数,然后再计算右操作数。只有在靠左操作数的值无法确定该逻辑表达式的结果时,才会去求解右操作数。这种求值方式也被称为“短路求值(short-circuit evaluation)”,&&和||的短路操作虽然会简化计算过程,但也会带来副作用:

int i=6;
int j=1;
if(i>0 || (j++)>0)
cout<<++j; //输出1

j++的计算会被忽略,对于||,如果一个为真,其他不需要考虑了,整个表达式是真,也就是C++编译器应用了“短路求值”的原则,如果后面的值不影响整个表达式的值,后面没必要再计算了。

当表达式中有||时,为避免编译器略掉后面的计算,适合将可能性小的表达式放在左边先计算,当然,最好的办法是在||的右边最好是不需要计算的表达式,以避免出错。

再来看&&运算符:

if(i<0 && (j++)>0)
cout<<++j; //输出1

j++的计算会被忽略,对于&&,如果一个为假,其他不需要考虑了,整个表达式是假,也就是C++编译器应用了“短路求值”的原则,如果后面的值不影响整个表达式的值,后面没必要再计算了。

当表达式中有&&时,为避免编译器略掉后面的计算,适合将可能性大的表达式放在左边先计算,当然,最好的办法是在&&的右边最好是不需要计算的表达式,以避免出错。

2 “贪心法则”

C语言有一个简单的“贪心法则”:每一个符号应该包含尽可能多的字符。

也就是说,编译器将源代码,从左到右,一个字符一个字符地读入,如果加入下一个字符依旧可以构成一个合法符号,则包含该字符,直到不可以为止。

如- 和 -- 都是合法运算符,但 --- 不是。

int a=8;
int b=3;
 cout<<a---b ;//输出5
cout<<a; //输出7

分析:

首先,a是一个合法符号,a-不是,所以第1个符号是a;
其次,-是一个合法符号,--也是一个合法符号,但---不是,所以第2个符号是--;
然后,-是一个合法符号,-b不是一个合法符号,所以第2个符号是-;
最后,只剩下一个字符b,它是一个合法的符号;
所以,a---b,依据贪心法则,得出的结果是:a -- - b ,也就是 (a--) - b;

(备注:合法的符号,如变量名,只能有大小写字母、数字和_下划线组成,并且不能是数字开头这里的a和b都是变量名。)

-End-
 

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>