布尔运算符的短路
首先,什么是表达式?
表达式是运算符和它们的操作数的序列,它指定一项计算。
表达式的求值可以产生一个结果(比如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.