Lua逻辑运算符与其他语言不同?

时间:2017-07-29 15:12:24

标签: lua

所以我开始搞乱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 ++或类似语言相同的结果?

3 个答案:

答案 0 :(得分:5)

此C代码会打印4

printf("%d\n", 4 & 5);

但由于4的二进制表示,这是一个意外。

确实,下面的代码打印4,既不是5也不是6

printf("%d\n", 5 & 6);

如果您使用逻辑,则此代码会打印1,而不是45

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块。