布尔运算符的短路

布尔运算符的短路

首先,什么是表达式?

表达式是运算符和它们的操作数的序列,它指定一项计算。

表达式的求值可以产生一个结果(比如2+2的求值产生结果4,也可能产生副作用(比如对std::printf(“%d”,4)的求值在标准输出上打印字符 ‘4’

以下代码每一行的内容都是一个表达式:

1
2
3
4
5
6
a = 1
a++
a = a * a + a - a | a
foo()
foo(a+a)
a == a

注意,a++是表达式,a++;就是一个语句了

其次,什么是表达式的副作用?

表达式,顾名思义,是有一个值的.很多情况下我们求一个表达式的值,是为了使用它的值.在求值的过程中对于变量的修改等操作被称为表达式的副作用.

比如,对于表达式y++,y的值+1就是这个表达式的副作用.

比如,对于以下函数:

1
2
3
4
int foo(){
static int i = 0;
return ++i;
}

对于表达式foo(),i的值的变化就是他的副作用.

再比如,对于表达式printf("%d",a) + 1,输出了a的值就是他的副作用.

布尔运算符的短路.

对于 “逻辑与(&&)” 和 “逻辑或(||)” 这两个运算,他们有一个不同于其他运算符的特点,就是运算符短路.

对于与运算,如果他左边的表达式(也叫第一操作数)计算完是假的话,无论右边的表达式(也叫第二操作数)的结果是多少,最终的结果一定是假,因此此时不会计算第二操作数,第二操作数的副作用也不会发生.

对于与运算,如果他左边的表达式(也叫第一操作数)计算完是真的话,无论右边的表达式(也叫第二操作数)的结果是多少,最终的结果一定是真,因此此时不会计算第二操作数,第二操作数的副作用也不会发生.

,对于以下代码:

1
2
3
4
5
int a,b,c;
a = 1;
b = 1;
c = a++ || b++;
printf("%d%d%d\n",a,b,c);

因为表达式a++的计算结果为1,也就是真,因此不会计算b++,程序会输出211.