Lua中and、or的一些特殊用法
2017-06-15 15:14
639 查看
Lua中的逻辑运算符:与(and)、或(or)和非(not),与其他语言的逻辑运算符功能一致,这里不做赘述。只说一点,所有的逻辑运算符将false和nil视为假,其他任何东西视为真,0也视为真。
这里要说的是and和or的一些特殊用法。
当连接2个操作数时:
1.对于运算符and来说,如果它的第一个操作数为假,就返回第一个操作数;不然返回第二个操作数。
所以,
[plain] view
plain copy
a = b and c
等价于:
[plain] view
plain copy
if not b then
a = b
else
a = c
end
举个栗子:
[plain] view
plain copy
print(2 and 3)
print(0 and 3)
print(nil and 7)
print(false and 7)
运行结果:
2.对于运算符or来说,如果它的第一个操作数为真,就返回第一个操作数,不然返回第二个操作数。
所以 ,
[plain] view
plain copy
a = b or c
等价于:
[plain] view
plain copy
if b then
a=b
else
a=c
end
举个栗子:
[plain] view
plain copy
print(4 or 5)
print(0 or 5)
print(nil or 8)
print(false or 8)
运行结果:
以上两点我之前都是硬记的,但发现过了一段时间后就会忘或者弄混,后来自己总结了一个方法记忆,再也不会弄混了。这个方法就是按照and和or的逻辑特性来联想记忆。
1).先说and:我们知道and是取与,与就是0 and 0 = 0、0 and 1 = 0、1 and 1 = 1,也就是说有一个为0值就为0,全为1表达式值才为1,所以,当and的第一个操作数为0的时候,我们就没有必要看后面的操作数了,此时表达式的值已经为0,我们就把第一个为0的操作数返回即可;如果第一个操作数为1,那么整个表达式的值就取决于第二个操作数了,第二个为0表达式值为0,第二个为1表达式值为1,所以因为第二个操作数是啥表达式值就是啥,那么我们就把第二个操作数返回就行了。
2).再说or,也是一个道理:or是取或,或就是0 or 0 = 0、0 or 1 = 1、1 or 1 = 1,也就是说有一个为1值就为1,全为0表达式值才为0,所以,当or的第一个操作数为1的时候,我们就没有必要看后面的操作数了,此时表达式的值已经为1,我们就把第一个为1的操作数返回即可;如果第一个操作数为0,那么整个表达式的值就取决于第二个操作数了,第二个为0表达式值为0,第二个为1表达式值为1,所以因为第二个操作数是啥表达式值就是啥,那么我们就把第二个操作数返回就行了。
好了,按照我以上的方法,当有多个操作数时也可以类推出结果:
3.and连接多个操作数时,表达式的返回值就是从左到右第一个为假的值,若所有操作数值都不为假,则表达式的返回值为最后一个操作数
举个栗子:
[plain] view
plain copy
print(2 and 3 and 4 and nil and false and 7 and 8)
print(2 and 3 and 4 and 5 and 6 and 7 and 8)
运行结果:
4.or连接多个操作数时,表达式的返回值就是从左到右第一个不为假的值,若所有操作数值都为假,则表达式的返回值为最后一个操作数
举个栗子:
[plain] view
plain copy
print(nil or false or 6 or 7 or 8)
print(nil or false )
print(false or nil )
运行结果:
此外,Lua中还经常会用到 "a and b or c ",这类似于C语言中的表达式 a ? b : c,例如选出x和y中的较大者,可以使用一下语句:
max = (x>y) and x or y
证明如下:
若 x>y,则 (x>y) = true,则 (x>y) and x = x,则 max = x or y = x;
若 x<y,则 (x>y) = false,则 (x>y) and x = (x>y),则 max = (x>y) or y = y。
这里要说的是and和or的一些特殊用法。
当连接2个操作数时:
1.对于运算符and来说,如果它的第一个操作数为假,就返回第一个操作数;不然返回第二个操作数。
所以,
[plain] view
plain copy
a = b and c
等价于:
[plain] view
plain copy
if not b then
a = b
else
a = c
end
举个栗子:
[plain] view
plain copy
print(2 and 3)
print(0 and 3)
print(nil and 7)
print(false and 7)
运行结果:
2.对于运算符or来说,如果它的第一个操作数为真,就返回第一个操作数,不然返回第二个操作数。
所以 ,
[plain] view
plain copy
a = b or c
等价于:
[plain] view
plain copy
if b then
a=b
else
a=c
end
举个栗子:
[plain] view
plain copy
print(4 or 5)
print(0 or 5)
print(nil or 8)
print(false or 8)
运行结果:
以上两点我之前都是硬记的,但发现过了一段时间后就会忘或者弄混,后来自己总结了一个方法记忆,再也不会弄混了。这个方法就是按照and和or的逻辑特性来联想记忆。
1).先说and:我们知道and是取与,与就是0 and 0 = 0、0 and 1 = 0、1 and 1 = 1,也就是说有一个为0值就为0,全为1表达式值才为1,所以,当and的第一个操作数为0的时候,我们就没有必要看后面的操作数了,此时表达式的值已经为0,我们就把第一个为0的操作数返回即可;如果第一个操作数为1,那么整个表达式的值就取决于第二个操作数了,第二个为0表达式值为0,第二个为1表达式值为1,所以因为第二个操作数是啥表达式值就是啥,那么我们就把第二个操作数返回就行了。
2).再说or,也是一个道理:or是取或,或就是0 or 0 = 0、0 or 1 = 1、1 or 1 = 1,也就是说有一个为1值就为1,全为0表达式值才为0,所以,当or的第一个操作数为1的时候,我们就没有必要看后面的操作数了,此时表达式的值已经为1,我们就把第一个为1的操作数返回即可;如果第一个操作数为0,那么整个表达式的值就取决于第二个操作数了,第二个为0表达式值为0,第二个为1表达式值为1,所以因为第二个操作数是啥表达式值就是啥,那么我们就把第二个操作数返回就行了。
好了,按照我以上的方法,当有多个操作数时也可以类推出结果:
3.and连接多个操作数时,表达式的返回值就是从左到右第一个为假的值,若所有操作数值都不为假,则表达式的返回值为最后一个操作数
举个栗子:
[plain] view
plain copy
print(2 and 3 and 4 and nil and false and 7 and 8)
print(2 and 3 and 4 and 5 and 6 and 7 and 8)
运行结果:
4.or连接多个操作数时,表达式的返回值就是从左到右第一个不为假的值,若所有操作数值都为假,则表达式的返回值为最后一个操作数
举个栗子:
[plain] view
plain copy
print(nil or false or 6 or 7 or 8)
print(nil or false )
print(false or nil )
运行结果:
此外,Lua中还经常会用到 "a and b or c ",这类似于C语言中的表达式 a ? b : c,例如选出x和y中的较大者,可以使用一下语句:
max = (x>y) and x or y
证明如下:
若 x>y,则 (x>y) = true,则 (x>y) and x = x,则 max = x or y = x;
若 x<y,则 (x>y) = false,则 (x>y) and x = (x>y),则 max = (x>y) or y = y。
相关文章推荐
- Lua中and、or的一些特殊用法
- Lua中and、or的一些特殊用法
- Lua中and、or的一些特殊使用方法
- delphi中and和or的特殊用法
- lua中逻辑运算符and与or的用法
- lua中逻辑运算符and与or的用法
- Lua中and和or的用法和记忆方法
- 宏定义的一些特殊用法
- DataTable的一些特殊用法:Select
- bgsound 背景音乐 的一些常用方法及特殊用法小结
- jqgrid一些特殊用法
- C# ToString()方法一些特殊用法
- Bitmap和Drawable一些特殊用法整理
- C# ToString()方法一些特殊用法集锦
- Oracle instr()函数的一些特殊用法
- C语言的一些特殊用法(#define)
- mysql where 条件语句中的OR和AND的用法注意!
- SQL AND OR的用法
- jquery validate plugin 的一些比较特殊的用法总结
- bgsound 背景音乐 的一些常用方法及特殊用法小结