所以我开始搞乱Lua的逻辑运算符和,或和不。
如上所述,here print (4 and 5)
将返回5
,而print (4 or 5)
将返回4
。
如果您随后切换数字,使其显示为print (5 and 4)
,则会返回4
。
我理解和运算符返回第一个操作数的解释,如果它是 false ,第二个操作数是 true ,但是我使用的是什么来自C ++等语言的是print (4 and 5)
返回4
。如何获得与C ++或类似语言相同的结果?
答案 0 :(得分:5)
此C代码会打印4
printf("%d\n", 4 & 5);
但由于4
的二进制表示,这是一个意外。
确实,下面的代码打印4
,既不是5
也不是6
:
printf("%d\n", 5 & 6);
如果您使用逻辑和,则此代码会打印1
,而不是4
或5
。
printf("%d\n", 4 && 5);
答案 1 :(得分:3)
and
/ or
运算符返回truthy值,如下所示:
or
在遵循运算符优先级之后从左到右进行求值时的第一个真值。这就是您在执行4
时获得print(4 or 5)
的原因。
and
链式and
操作中遇到的最后一个真值。因此,当您执行4
时,您会收到print(5 and 4)
。
以上规则是您在执行时可以将and/or
操作链接为三元运算符的原因:
condition and expression or expression
-- which in C/C++ would be (condition) ? expression : expression
如果您对来自C / C ++语言的and
和&
感到困惑,那么您应该改为使用bitwise operators。
&
:按位和
|
:按位或
~
:按位异或OR>>
:右移
<<
:左移
~
:一元按位NOT
对于lua 5.2:
print( bit32.band(4, 5) )
会给你4
。
答案 2 :(得分:1)
你正在混淆&amp;运算符在C / C ++中。它是按位和操作,这意味着它会查看数字的二进制表示。
基本上,&amp;运算符查看两个数字中的每个二进制位值,如果两个值均为1,则保持为1,如果其中任何一个为零,则保持为1。在实践中:
0 1 0 0 // 4 in binary
& 0 1 0 1 // 5 in binary
------------
0 1 0 0 // also 4 in binary
Lua中的和功能完全不同。你说你理解它的作用所以我不会再解释它,但是&amp; C语言中的运算符完全不同。它仅对数字进行操作,并且由于使用和关键字的那些语言中的静态类型将仅返回布尔值true或false,而不是像Lua那样的任何特定值。
希望这会有所帮助。如果你想要做一个像变量一样的变量是一个基于简单测试的值,比如它是否大于一个特定的数字,或者是默认值,你可以做这样的事情(在Lua中):
local a = 4
local var = (a > 5) and a or 5
除了其他事项外,您还可以设置一个最小值,而不是if / else块。