逻辑与、逻辑或操作符在使用时,总是先计算它的左操作数,然后再计算右操作数。只有在靠左操作数的值无法确定该逻辑表达式的结果时,才会去求解右操作数。这种求值方式也被称为“短路求值(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++编译器应用了“短路求值”的原则,如果后面的值不影响整个表达式的值,后面没必要再计算了。
当表达式中有&&时,为避免编译器略掉后面的计算,适合将可能性大的表达式放在左边先计算,当然,最好的办法是在&&的右边最好是不需要计算的表达式,以避免出错。
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-