Lua中的逻辑运算符:与(and)、或(or)和非(not),与其它语言的逻辑运算符功能一致,这里不做赘述。仅仅说一点,全部的逻辑运算符将false和nil视为假,其它不论什么东西视为真。0也视为真

这里要说的是and和or的一些特殊使用方法。

当连接2个操作数时:

1.对于运算符and来说,假设它的第一个操作数为假,就返回第一个操作数;不然返回第二个操作数。

所以,

a = b and c

等价于:

if not b then
a = b
else
a = c
end

举个栗子:

print(2 and 3)
print(0 and 3)
print(nil and 7)
print(false and 7)

执行结果:

 

2.对于运算符or来说,假设它的第一个操作数为真。就返回第一个操作数,不然返回第二个操作数。

所以 ,

a = b or c

等价于:

if b then
a=b
else
a=c
end

举个栗子:

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连接多个操作数时,表达式的返回值就是从左到右第一个为假的值。若全部操作数值都不为假。则表达式的返回值为最后一个操作数

举个栗子:

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连接多个操作数时,表达式的返回值就是从左到右第一个不为假的值,若全部操作数值都为假,则表达式的返回值为最后一个操作数

举个栗子: 

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的一些特殊使用方法的更多相关文章

  1. Lua中的模块与包

    [前言] 从Lua5.1版本开始,就对模块和包添加了新的支持,可是使用require和module来定义和使用模块和包.require用于使用模块,module用于创建模块.简单的说,一个模块就是一个 ...

  2. lua中基类和“继承机制”

    基类:基类定义了所有对于派生类来说普通的属性和方法,派生类从基类继承所需的属性和方法,且在派生类中增加新的属性和方法. 继承:继承是C++语言的一种重要机制,它允许在已定义的类的基础上产生新类. lu ...

  3. lua中实现异步资源读写

    同样还是更新方面的需求,当我们检测到版本是新安装的以后,要进行upd目录清除.如果使用os.execute执行 rm -rf ooxx 是非常快的但由于os.execute一旦报错,那整个lua进程就 ...

  4. lua中清空目录和递归创建目录

    lua中的 lfs.mkdir lfs.rmdir只能针对单个目录,且lfs.rmdir不能清空文件夹 于是我想到了使用os.execute 递归创建目录如下os.execute("mkdi ...

  5. lua中的string类型

    在lua中用union TString来表示字符串类型 lobject.h: 其中结构体tsv中 reserved字段表示字符串是不是保留关键字,hash是其哈希值,len是其长度.我们在TStrin ...

  6. 在 lua 中实现函数的重载

    在 lua 中实现函数的重载.注:好吧,lua中原来可以实现重载...local function create() local arg_table = {} local function dispa ...

  7. lua中的table、stack和registery

    ok,前面准备给一个dll写wrapper,写了篇日志,看似写的比较明白了,但是其实有很多米有弄明白的.比如PIL中使用的element,key,tname,field这些,还是比较容易混淆的.今天正 ...

  8. lua中的协程

    lua中的协程和线程类似: 1. 协程拥有自己的独立的栈,局部变量,和指令: 2. 所有协程都可以共享全局变量: 3. 协程不能像线程那样并行执行,协程之间需要相互协调执行,同一个时刻只能运行一个协程 ...

  9. lua 中的面向对象

    lua 是一种脚步语言,语言本身并不具备面向对象的特性. 但是我们依然可以利用语言的特性,模拟出面向对象的特性. 面向对象的特性通常会具备:封装,继承,多态的特性,如何在lua中实现这些特性,最主要的 ...

  10. lua中for循环的四种遍历方式

    lua中for的四种遍历方式区别 table.maxn 取最大的整数key #table 从1开始的顺序整数最大值,如1,2,3,6 #table == 3   key,value pairs 取每一 ...

随机推荐

  1. 关于gitblit成功启动,但在阿里云外网地址无法访问的问题

    1.配置/data/defaults.properties server.httpBindInterface= 此处什么都不要填空着就好. # Specify the interface for Je ...

  2. 错误提示:通过 Web 服务器的身份验证的用户无权打开文件系统上的文件

    //win7中iis配置好了可是网页打不开,为什么.? //错误提示:通过 Web 服务器的身份验证的用户无权打开文件系统上的文件 //解决办法1.右键单击你的网站根目录文件夹,如wwwroot文件夹 ...

  3. 编译安装imagick出错:make: *** [imagick_class.lo] Error 1

    /usr/local/lnmpsrc/imagick-3.0.1/imagick_class.c:9673: warning: assignment makes pointer from intege ...

  4. 航信电子发票开发(servlet请求方式)

    在系统用户交费后,需要打印发票,可以选择普票或者机打票(票据信息在系统中自定义设置的),也可以打印电子发票,这里对接的是航信的电子发票,请求方式非web服务,而是使用servlet通过HTTP请求的方 ...

  5. linux shell 脚本攻略学习13--file命令详解,diff命令详解

    一.file命令详解 find命令可以通过查看文件内容来找出特定类型的文件,在UNIX/ Linux系统中,文件类型并不是由文件扩展名来决定的(windows中却正是这么做的),file命令的目的是从 ...

  6. JavaScript 字符串(String)对象

    String 对象 String 对象用于处理文本(字符串). 创建 String 对象的语法: new String(s); String(s); 参数 参数 s 是要存储在 String 对象中或 ...

  7. iOS 关于 GIF 图片那点事

    前言 前几天我们项目组的群里提了这么一件事情:在我们的应用中存储动态的GIF图到相册,保存的图片变成了静态图片.而微博则能正确保存,可见这并不是一个技术不可实现的.前不久刚好看了苹果关于ImageIO ...

  8. mysql配置文件 /etc/my.cnf 详细解释

    basedir = path 使用给定目录作为根目录(安装目录). character-sets-dir = path 给出存放着字符集的目录. datadir = path 从给定目录读取数据库文件 ...

  9. SpringBoot配置属性之MQ

    SpringBoot配置属性系列 SpringBoot配置属性之MVC SpringBoot配置属性之Server SpringBoot配置属性之DataSource SpringBoot配置属性之N ...

  10. Centos 安装ImageMagick 与 imagick for php步骤详解

    现在有很多朋友在使用安装ImageMagick imagick for php了,今天自己也想做但是不知道如何操作,下面我来给大家介绍Centos 安装ImageMagick imagick for ...