找回密码
 注册
搜索
查看: 2974|回复: 27

fqyy的lua笔记(1)------与或非运算

[复制链接]
门派:古墓派
发表于 2018-7-6 15:03:00 | 显示全部楼层 |阅读模式
本帖最后由 muder@tj 于 2018-7-22 09:16 编辑

与 and
或 or
非 not
这三个都是逻辑运算符,一般用来判断条件是否满足我们的需求
lua有一个特性默认所有nil 和false 值为假   其余都为真(包括0)
与 and     运算符两端都为真返回真  lua中也有特性就是都为真时返回 and左边的算式值  为假时返回右边算式值
或 or       运算符两端有一项符合要求时返回真   lua中特性是当任意一项为真时可以返回or左边的算式值,为假时返回右边算式值
非not      这个简单就是取逻辑反值 真取假假取真

例如1
a=true and true,    a=true      
a=true and false,      a=false
b=true or true,        b=true
b=false or ture,        b=true
b= false or false,       b=false
c=not  true ,            c=false

连续判断 优先级为not>and>or    not不用说,and可以想象是乘法 or想象是加法   true想象是1  false想象是0
例子2
a= true and true or false,   a=1*1+0,a=true
a=true or false and true,   a=1+0*1 ,   a=true
a=true and false and true,   a=1*0*1,    a=false

lua特例  由于lua不止可以返回逻辑值,还可以返回逻辑运算符前后的算式值,所以我们可以这样玩
function xxx(n,l,w)  x=w[2] or "没取到值"  end   抓到变量就赋值为变量,没抓到就赋值字符“没取到值”
昨天举的例子有问题删除了,误导大家很抱歉
加了几个新例子:
a and b       -- 如果a为false,则返回a,否则返回b
a or  b        -- 如果a为true,则返回a,否则返回b
print(4 and 5)           --> 5
print(nil and 13)        --> nil
print(false and 13)      --> false
print(4 or 5)            --> 4
print(false or 5)        --> 5



例子3
x= a and b or c    x=?
x= a and b and c  x=?
x= a or b or c      x=?
大家有兴趣算一下没?


补转一篇lua的基本概念
参考手册http://cloudwu.github.io/lua53doc/contents.html
Lua 是一门动态类型语言。 这意味着变量没有类型;只有值才有类型。 语言中不设类型定义。 所有的值携带自己的类型。

Lua 中所有的值都是 一等公民。 这意味着所有的值均可保存在变量中、 当作参数传递给其它函数、以及作为返回值。

Lua 中有八种基本类型: nil、boolean、number、string、function、userdata、 thread 和 table。 Nil 是值 nil 的类型, 其主要特征就是和其它值区别开;通常用来表示一个有意义的值不存在时的状态。 Boolean 是 false 与 true 两个值的类型。 nil 和 false 都会导致条件判断为假; 而其它任何值都表示为真。 Number 代表了整数和实数(浮点数)。 String 表示一个不可变的字节序列。 Lua 对 8 位是友好的: 字符串可以容纳任意 8 位值, 其中包含零 ('\0') 。 Lua 的字符串与编码无关; 它不关心字符串中具体内容。

number 类型有两种内部表现方式, 整数 和 浮点数。 对于何时使用哪种内部形式,Lua 有明确的规则, 但它也按需(参见 §3.4.3)作自动转换。 因此,程序员多数情况下可以选择忽略整数与浮点数之间的差异或者假设完全控制每个数字的内部表现方式。 标准 Lua 使用 64 位整数和双精度(64 位)浮点数, 但你也可以把 Lua 编译成使用 32 位整数和单精度(32 位)浮点数。 以 32 位表示数字对小型机器以及嵌入式系统特别合适。 (参见 luaconf.h 文件中的宏 LUA_32BITS 。)

Lua 可以调用(以及操作)用 Lua 或 C (参见 §3.4.10)编写的函数。 这两种函数有统一类型 function。

userdata 类型允许将 C 中的数据保存在 Lua 变量中。 用户数据类型的值是一个内存块, 有两种用户数据: 完全用户数据 ,指一块由 Lua 管理的内存对应的对象; 轻量用户数据 ,则指一个简单的 C 指针。 用户数据在 Lua 中除了赋值与相等性判断之外没有其他预定义的操作。 通过使用 元表 ,程序员可以给完全用户数据定义一系列的操作 (参见 §2.4)。 你只能通过 C API 而无法在 Lua 代码中创建或者修改用户数据的值, 这保证了数据仅被宿主程序所控制。

thread 类型表示了一个独立的执行序列,被用于实现协程 (参见 §2.6)。 Lua 的线程与操作系统的线程毫无关系。 Lua 为所有的系统,包括那些不支持原生线程的系统,提供了协程支持。

table 是一个关联数组, 也就是说,这个数组不仅仅以数字做索引,除了 nil 和 NaN 之外的所有 Lua 值 都可以做索引。 (Not a Number 是一个特殊的数字,它用于表示未定义或表示不了的运算结果,比如 0/0。) 表可以是 异构 的; 也就是说,表内可以包含任何类型的值( nil 除外)。 任何键的值若为 nil 就不会被记入表结构内部。 换言之,对于表内不存在的键,都对应着值 nil 。

表是 Lua 中唯一的数据结构, 它可被用于表示普通数组、序列、符号表、集合、记录、图、树等等。 对于记录,Lua 使用域名作为索引。 语言提供了 a.name 这样的语法糖来替代 a["name"] 这种写法以方便记录这种结构的使用。 在 Lua 中有多种便利的方式创建表(参见 §3.4.9)。

我们使用 序列 这个术语来表示一个用 {1..n} 的正整数集做索引的表。 这里的非负整数 n 被称为该序列的长度(参见 §3.4.7)。

和索引一样,表中每个域的值也可以是任何类型。 需要特别指出的是:既然函数是一等公民,那么表的域也可以是函数。 这样,表就可以携带 方法 了。 (参见 §3.4.11)。

索引一张表的原则遵循语言中的直接比较规则。 当且仅当 i 与 j直接比较相等时 (即不通过元方法的比较), 表达式 a 与 a[j] 表示了表中相同的元素。 特别指出:一个可以完全表示为整数的浮点数和对应的整数相等 (例如:1.0 == 1)。 为了消除歧义,当一个可以完全表示为整数的浮点数做为键值时, 都会被转换为对应的整数储存。 例如,当你写 a[2.0] = true 时, 实际被插入表中的键是整数 2 。 (另一方面,2 与 "2" 是两个不同的 Lua 值, 故而它们可以是同一张表中的不同项。)

表、函数、线程、以及完全用户数据在 Lua 中被称为 对象: 变量并不真的 持有 它们的值,而仅保存了对这些对象的 引用。 赋值、参数传递、函数返回,都是针对引用而不是针对值的操作, 这些操作均不会做任何形式的隐式拷贝。

库函数 type 用于以字符串形式返回给定值的类型。 (参见 §6.1)。

评分

2

查看全部评分

门派:丐帮
发表于 2018-7-6 15:21:12 | 显示全部楼层
题目没说a,b,c已知是true or false 啊
门派:丐帮
发表于 2018-7-6 15:51:18 | 显示全部楼层
有点高深,要慢慢学习了。。。。。

感谢风神扫盲     
门派:嵩山派
发表于 2018-7-6 16:09:48 | 显示全部楼层
谢谢风神,这个帖子很有用。希望能多出些类似的讲解。
门派:嵩山派
发表于 2018-7-6 16:10:54 | 显示全部楼层
kuer@tj 发表于 2018-7-6 15:21
题目没说a,b,c已知是true or false 啊

这个不需要啊,关键是明白具体是怎么运算的,返回的是什么值。
门派:嵩山派
发表于 2018-7-6 16:11:39 | 显示全部楼层
强烈呼吁馆长对这个帖子加分,对新人学习太有帮助了。
门派:古墓派
 楼主| 发表于 2018-7-6 16:13:31 | 显示全部楼层
kuer@tj 发表于 2018-7-6 15:21
题目没说a,b,c已知是true or false 啊

其实就是想想  x等于a还是b还是c,为真的时候什么状态,为假的时候什么状态
可能我说的太笼统了
门派:古墓派
 楼主| 发表于 2018-7-6 16:17:25 | 显示全部楼层
marmot@tj 发表于 2018-7-6 16:09
谢谢风神,这个帖子很有用。希望能多出些类似的讲解。

我水平有限,也只能讲讲简单的,算法数据 什么的再深我也不会了。
lua值得研究的东西挺多的,但目前不是啥主流编程语言。
不过呢编程一通百通,用什么语言写就看自己怎么练了。
门派:嵩山派
发表于 2018-7-6 16:23:45 | 显示全部楼层
syayas@tj 发表于 2018-7-6 16:17
我水平有限,也只能讲讲简单的,算法数据 什么的再深我也不会了。
lua值得研究的东西挺多的,但目前不是 ...

不,我觉得风神你的理解确实蛮透彻的。给我们这些小白讲解一下一点问题都没有。确实lua只是一个小东西,不过就像你说的编程这个东西是一通百通。如果lua最后能熟练掌握的话那么学习其他语言也应该要轻松很多。顶多就是语法不同需要去适应和修改罢了。当然不是说学lua就是为了以后去学别的语言,只是针对mud来说。起码要懂得如何去写一个复杂robot以及为什么要这么写,我觉得这才是mud的乐趣之所在。确实我一直觉得新手为什么入不了门,是因为没有一个合适的引导方式。现在网上流传的各种教程其实不能起到太大的帮助,多数只是教一些很简单很基础的东西。也许随便查查资料都查得到,但实际如何运用在mush的robot上面,真的没有几个教程对这个问题进行很细致的引导。这些都是新人玩mud的障碍。至少我是这样觉得的。
门派:古墓派
 楼主| 发表于 2018-7-6 16:40:22 | 显示全部楼层
mud的robot其实是lua里面最简单的应用,目前公版robot也是多年积累的打补丁方式写出来的,基本就是单线程,执行xx后再执行xx其实很多都可以优化的地方,要是按照mvc架构重写,效率能提高不少,以后填功能也会简单,不过没必要哈哈,没谁愿意投入这个精力。

而且目前mud的流程基本固定了,就是
xx触发
开启xxx功能
xxx功能的触发
执行xxxxx
检测执行完毕
再执行xxxxxxxx
关闭xxx功能
执行下一个xxx
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|书剑永恒MUD ( 闽ICP备14012032号|闽公网安备 35050202000162号 )

GMT+8, 2025-6-10 10:43 , Processed in 0.033773 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表