逻辑运算符的短路特性
逻辑运算符&& 和 ||在执行时,如果前边的结果能够决定整个表达式的结果,那么就不会执行下一条语句。
- 比如 && ,前边的式子执行的结果为false,那么后边的结果就不需要执行。因为后边的式子不论结果是什么,整个表达式的结果都为false
- 同理,在|| 语句中,假设前边的式子为true,那么整个式子的结果就为true,而无需执行后边的式子
举例说明
- 与(
&&
) 运算
package main
import "fmt"
func main() {
a,b := 1,0
if a < 0 && a / b > 0 { //b == 0,因此假设代码执行到`&&`运算符之后,那么代码会报错
fmt.Println("OK")
}
fmt.Println("结束")
}
代码在执行时,因为b == 0
,那么如果代码执行到a / b > 0
的部分则会报错。执行结果
对以上结果的说明:因为a<0 的执行结果为false,并且之后为
&&
逻辑,那么这个语句不往后执行,直接将执行的结果置为false。那么if判断的结果为假,直接打印”结束“。
package main
import "fmt"
func main() {
a,b := 1,0
if a > 0 && a / b > 0 { //b == 0,因此假设代码执行到`&&`运算符之后,那么代码会报错
fmt.Println("OK")
}
fmt.Println("结束")
}
将if之后的a < 0
改为a > 0
,那么这一句为真,需要执行&&
之后的条件,此时应该报错:
-
或(
||
)运算或运算和与运算正好相反,在前边式子执行为false的情况下会继续向后执行,若前边式子执行为true,则不再向后执行
package main
import "fmt"
func main() {
a,b := 1,0
if a < 0 || a / b > 0 { //b == 0,因此假设代码执行到`&&`运算符之后,那么代码会报错
fmt.Println("OK")
}
fmt.Println("结束")
}
上述代码执行结果:
对上述结果的说明:在
||
符号之前,a < 0
判断为假,那么需要向后执行,此时b == 0
,不能作为除数,代码报错
对代码进行更改,如下
package main
import "fmt"
func main() {
a,b := 1,0
if a > 0 || a / b > 0 { //b == 0,因此假设代码执行到`&&`运算符之后,那么代码会报错
fmt.Println("OK")
}
fmt.Println("结束")
}
执行结果:
此时,
a > 0
,执行的结果为true,那么||
语句不再向后执行,则if判断为真,打印if条件下的”OK“,之后打印”结束“