逻辑运算符

逻辑操作符将其操作数视为条件表达式(与布尔值true比较的等式,请参考:等式运算符 ),首先将操作数求值,并转换为逻辑值(boolean值),0,null转换为false,而所有非零、非false、非null值转换为true,如果结果为false则条件为假,结果为true则条件为真。

一、逻辑非

逻辑非运算符首先取得操作数的布尔值(boolean),然后取反比较。
如要操作数为true则返回false,如果操作数为false则返回true.也就是反过来取值的意思。

运算符 说明
! 逻辑非
not 逻辑非

 

二、逻辑或

逻辑或要求两个操作数其中之一为真( true ),如果第一个操作数为真则直接返回第一个操作数,否则返回第二个操作数。表达式会直接返回操作数的原值(不是转换为逻辑值的truefalse

运算符 说明
|| 逻辑或
or 逻辑或
: 逻辑或,注意当 : 号作为键值对分隔符时不表示逻辑或。

 

三、逻辑与

逻辑与要求两个操作数取布尔值后都为true,如果第一个操作数为真则返回第二个操作数,如果第一个操作数为假则返回第一个操作数(注意返回的是操作数原值,而不是转换后的布尔值)。

运算符 说明
&& 逻辑与
and 逻辑与
? 逻辑与

 

四、惰性求值

逻辑与、逻辑或运算符支持惰性求值,当取得第一个操作数的值并满足条件时,即不再计算第二个表达式的值。

io.open()

a = true || io.print("偷懒成功,第一个操作数已经能决定返回值了") 
a = false && io.print("偷懒成功,第一个操作数已经能决定返回值了") 
a = true && io.print("偷懒失败,第一个操作数已经不能决定返回值") 

五、条件取值

逻辑或、逻辑运算符返回的不是转换后的布尔值,而是操作的原值,利用此特性,可以有条件的取得操作数的值。

io.open()

io.print( true ? 123 ) //显示123
io.print( false ? 123 ) //显示false
io.print( 0 : 123 ) //显示123
io.print( 1 : 123 ) //显示1 

io.print( false ? 2 : 3 ) //显示3
io.print( true ? 2 : 3 ) //显示2 
io.print( true ? false : 3 ) //显示3
io.print( true && false || 3 ) //同上
使用逻辑操作符构建a?b:c的三元表达式时,如果a为真但是b为false,返回的是c的原值, 这一点与C++的三元操作符略有区别。

四、条件赋值

逻辑或、逻辑与操作符可以用于赋值语句,进行有有条件赋值。

a = a : 123;//如果a为false、null、0时赋值为123
a := 123; //等价于上面的语句,通常用于常量赋值,以避免重复赋值。

a := b 是复合赋值语句,等价于 a = a : b

a ?= b(a) 也是经常会用到的赋值技巧。表达式b依赖于左值a,如果a为null,则b(a)会失败,使用条件赋值可以避免程序抛出错误并中断运行。请看下面的示例:

io.open()
str = "abcdefg"
str ?= string.left(str,3); //如果str为null,则不赋值,以避免string.left抛出错误
io.print( str )