布尔运算符的短路
布尔运算符的短路
首先, 什么是表达式?
表达式是运算符和它们的操作数的序列,它指定一项计算。
表达式的求值可以产生一个结果(比如 2+2 的求值产生结果 4),也可能产生副作用(比如对 std::printf(“%d”,4) 的求值在标准输出上打印字符 ‘4’)。
以下代码每一行的内容都是一个表达式:
1 | a = 1 |
注意, a++
是表达式, a++;
就是一个语句了
其次, 什么是表达式的副作用?
表达式, 顾名思义, 是有一个值的. 很多情况下我们求一个表达式的值, 是为了使用它的值. 在求值的过程中对于变量的修改等操作被称为表达式的副作用.
比如, 对于表达式 y++
, y
的值+1
就是这个表达式的副作用.
比如, 对于以下函数:
1 | int foo(){ |
对于表达式 foo()
, i
的值的变化就是他的副作用.
再比如, 对于表达式 printf("%d",a) + 1
, 输出了a
的值就是他的副作用.
布尔运算符的短路.
对于 “逻辑与(&&)” 和 “逻辑或(||)” 这两个运算, 他们有一个不同于其他运算符的特点, 就是运算符短路.
对于与运算, 如果他左边的表达式(也叫第一操作数)计算完是假的话, 无论右边的表达式(也叫第二操作数)的结果是多少, 最终的结果一定是假, 因此此时不会计算第二操作数, 第二操作数的副作用也不会发生.
对于与运算, 如果他左边的表达式(也叫第一操作数)计算完是真的话, 无论右边的表达式(也叫第二操作数)的结果是多少, 最终的结果一定是真, 因此此时不会计算第二操作数, 第二操作数的副作用也不会发生.
如, 对于以下代码:
1 | int a,b,c; |
因为表达式a++
的计算结果为1
, 也就是真, 因此不会计算b++
, 程序会输出211.