lua中有三个逻辑操作符:and,or,not(逻辑与,逻辑或,逻辑非),同样c++也有类似的三个逻辑操作符:&&,||,!(逻辑与,逻辑或,逻辑非)。他们的运算对象就是真和假。lua中nil和false是属于假,true和其他任何东西都是真。c++中也有类似的东西。0,NULL和false属于假,true其他任何非空的东西都属于真。lua与c++中逻辑运算规则相似却又有所不同。
他们都采用短路求值(short-circuit evaluation)的策略。即:逻辑与和逻辑或操作符都是先求左侧运算对象的值再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式的结果时才会计算右侧运算对象的值。这句话可以推导出很多令大家初看下比较诧异的说法。
比如说:Lua中,and运算规则是:"如果and的第一个操作数(左操作数)是假就返回第一个操作数,如果为真就返回第二个操作数(右操作数)"。这句话其实很好理解,如果左操作数是假的,我们就不必再判断第二个操作数,直接返回假就行了,也就是左操作数。如果左操作数是真,那么我们还得看右操作数,他为真,返回值就是真,他为假,返回值就是假。对应上面的"如果为真就返回第二个操作数(右操作数)"。细心的朋友会发现,lua返回的是操作数而非操作数对应的true或false。这一点也是lua和c++的区别所在,c++的逻辑操作返回的一定是0或1。
/*c++代码*/
std::cout<<(4&&5); //输出是1(返回true)
std::cout<<(4||5); //输出是1 (返回true)
--lua代码
print(4 and 5); --输出是5 (返回数值5)
print(4 or 5); --输出是4(返回数值4)
虽然在这一点上c++和lua上有所区别,但这点差异也只是让lua的逻辑操作符有了c++中三目运算符? : 的功能。比如说:
a and b or c -- 相当于a?b:c (*注意这是有前提的,前提就是b不为nil或false,即b是为真的)
max=(x>y)and x or y --这句代码可以求两者中大的一个并赋值到max
有一点不得不说,Lua中0也是为真的哦,这一点也很重要。