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

所以我开始尝试使用 Lua 的逻辑运算符 andornot。 在这里 https://www.lua.org/pil/3.3.html 中说明了 print(4 and 5) 将返回 5,而 print(4 or 5) 将返回 4。 如果你把数字换成 print(5 and 4),它将返回 4。 我理解 and 运算符返回第一个操作数,如果它为 false,则返回第二个操作数,但我从像 C++ 这样的语言中习惯 print (4 and 5) 返回 4 的结果。如何在 Lua 中获得与 C++ 或类似语言相同的结果?

点赞
用户107090
用户107090

这段 C 代码确实会打印 4

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

但这是 4 的二进制表示造成的意外。

事实上,接下来的代码将打印 4,而不是 56

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

如果你使用逻辑 _and_,那么这段代码会打印 1,而不是 45

printf("%d\n", 4 && 5);
2017-07-29 15:23:10
用户1190388
用户1190388

and/or 运算符的返回值如下:

or

从左到右按照运算符优先级计算出的第一个真值。这就是为什么执行 print(4 or 5) 时会得到 4

and

在链式的 and 操作中遇到的最后一个真值。因此,执行 print(5 and 4) 时会得到 4

这些规则是你可以通过链式的 and/or 操作来模拟三元运算符的原因,例如:

condition and expression or expression
-- 等价于 C/C++ 语言中的 (condition) ? expression : expression

如果你把 and 与 C/C++ 语言中的 & 混淆起来了,那么你应该使用 位运算符

&:按位与

|:按位或

~:按位异或

>>:右移

<<:左移

~:按位取反


对于 Lua 5.2:

print(bit32.band(4, 5))

会输出 4

2017-07-29 15:27:22
用户8201190
用户8201190

你混淆了在 C/C++ 中 & 运算符的作用。它是一种按位与运算,也就是说它查看数字的二进制表示。

本质上,& 运算符会查看两个数中的每个二进制位,如果都为 1 时就保留 1,如果任意一个是 0 就保留 0。在实践中:

  0 1 0 0    // 4 的二进制表示
& 0 1 0 1   // 5 的二进制表示
------------
  0 1 0 0    // 同样是 4 的二进制表示

Lua 中的 and 函数则完全不同。你说了你理解它的作用,所以我就不再解释了,但是类 C 语言中的 & 运算符的作用却完全不同。它只处理数字,且由于这些语言的静态类型,使用 and 关键字只会返回一个布尔值,而不是像 Lua 一样的特定值。

希望这可以帮到你。如果你碰巧想要做类似于让变量根据简单的测试来赋值的操作,比如如果大于一个特定数则为该值,否则为默认值,你可以这样做(在 Lua 中):

local a = 4
local var = (a > 5) and a or 5

这样,你就可以在不使用完整的 if/else 语句的情况下设置 a 可以达到的最小值。

2017-08-01 02:10:19