运算符教程

lua-users home
wiki

表达式被求值以执行计算,这些计算可能将值赋予变量或将参数传递给函数。表达式在参考手册的第 2.5 节中得到了很好的介绍。[1] 为了完整性和提供更多示例,这里也介绍了表达式。

在本页中,我们将使用=表达式简写符号。这些值可以很容易地分配给一个变量,例如:

> x = 7
> print(x)
7
> = 7
7

算术表达式

Lua 具有常见的二元算术运算符。

> = 2+3, 5-12, 2*7, 7/8
5       -7      14      0.875
> = 5*(2-8.3)/77.7+99.1
98.694594594595
一元否定
> = -(-10), -(10)
10      -10
模运算(除法余数)
> = 15%7, -4%3, 5.5%1
1       2       0.5
乘方
> = 7^2, 107^0, 2^8
49      1       256

关系表达式

关系运算符返回布尔值truefalse

示例

> = 1 == 1, 1 == 0
true    false
> = 1 ~= 1, 1 ~= 0
false   true
> = 3 < 7, 7 < 7, 8 < 7
true	false	false
> = 3 > 7, 7 > 7, 8 > 7
false	false	true
> = 3 <= 7, 7 <= 7, 8 <= 7
true    true    false
> = 3 >= 7, 7 >= 7, 8 >= 7
false   true    true
这些也适用于字符串(按字母顺序)和其他类型。
> = "abc" < "def"
true
> = "abc" > "def"
false
> = "abb" < "baa"
true
> = "abc" == "abc"
true
> = "abc" == "a".."bc"
true
如果类型不同或引用不同的对象,则对象将不相等。
> = {} == "table"
false
> = {} == {}  -- two different tables are created here
false
> t = {}
> t2 = t
> = t == t2   -- we're referencing the same table here
true
这里不进行强制类型转换,必须显式转换类型。有关强制类型转换的说明,请参见NumbersTutorialStringsTutorial
> = "10" == 10
false
> = tonumber("10") == 10
true

逻辑运算符

Lua 提供了逻辑运算符andornot。在 Lua 中,nil和布尔值false在逻辑表达式中都表示假。任何不是假(nilfalse)的值都是true,包括 0,这对于来自某些其他语言的人来说可能令人惊讶。在本页末尾有更多关于此含义的说明。

> = false==nil   -- although they are both considered false by logical operators, they're still different values
false
> = true==false, true~=false
false   true
> = 1==0
false

not

关键字not反转逻辑表达式的值

> = true, false, not true, not false
true    false   false   true
> = not nil       -- nil represents false
true
> = not not true  -- true is not not true!
true
> = not "foo"     -- anything not false or nil is true
false

and

二元运算符and不一定返回布尔值truefalse到逻辑表达式x and y。在某些语言中,and运算符返回一个取决于两个输入的布尔值。相反,在 Lua 中,如果第一个参数的值为falsenil,则它返回第一个参数(甚至不执行第二个参数),如果第一个参数不是falsenil,则返回第二个参数。因此,只有当第一个参数为false或第二个参数为布尔值时,才会返回布尔值。即最小化求值。

> = false and true  -- false is returned because it is the first argument
false
> = nil and true    -- as above
nil
> = nil and false
nil
> = nil and "hello", false and "hello"
nil     false
> = false and print("hello") -- the print function isn't evaluated, so "hello" isn't printed
false
以上所有表达式都返回第一个参数。以下所有表达式都返回第二个参数,因为第一个参数为真。
> = true and false
false
> = true and true
true
> = 1 and "hello", "hello" and "there"
hello   there
> = true and nil
nil
> = true and print("hello") -- the print function is evaluated here, so "hello" is printed
hello
nil
如您所见,逻辑表达式仍然被正确求值,但由于返回的值,我们有一些有趣的行为。

or 二元运算符也不一定返回布尔值(参见上面关于 and 的说明)。如果第一个参数为真,则返回第一个参数,否则返回第二个参数。因此,只有当第一个参数为 true 或第二个参数为布尔值时,才会返回布尔值。

> = true or false
true
> = true or nil
true
> = "hello" or "there", 1 or 0
hello   1
> = true or print("hello") -- the print function isn't evaluated, so "hello" isn't printed
true
以上所有表达式都返回第一个参数。以下所有表达式都返回第二个参数,因为第一个参数为 falsenil
> = false or true
true
> = nil or true
true
> = nil or "hello"
hello
> = false or print("hello") -- the print function is evaluated here, so "hello" is printed
hello

这可能是一个非常有用的特性。例如,在函数中设置默认值

> function foo(x)
>>  local value = x or "default"  -- if argument x is false or nil, value becomes "default"
>>  print(value, x)
>> end
>
> foo()       -- no arguments, so x is nil
default nil
> foo(1)
1       1
> foo(true)
true    true
> foo("hello")
hello   hello

三元运算符

尽管 Lua 没有三元运算符(if/else 表达式),但可以使用 andor 来创建类似的行为

value = condition and trueval or falseval;
如果 condition 为真,则返回 trueval,否则返回 falseval。为了更好地理解这一点,请记住 and 的优先级高于 or
value = (condition and trueval) or falseval;
如果 condition 为真,这将导致 and 运行 trueval 并返回其值。否则,整个 and 表达式部分将为假,触发 or 表达式运行 falseval。请注意,如果 trueval 为 nilfalse,则会运行 falseval。如果已知 falseval 始终为“真”值,则可以通过否定 condition 来解决此问题,否则您只需要使用 if-then-else 语句。

这在“value = false and true or false”的情况下不起作用。


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2017 年 4 月 28 日凌晨 4:16 GMT (差异)