开头先说结论

1.简单版三目运算符(需要自我保证“b”不为“false”)

a and b or c

2.通用版三目运算符

(a and {b} or {c})[1]

浅谈推导过程

我们首先需要知道lua中的以下几点规则

1.lua中只有“false”和“nil”视为“假”,其他任何一切都为“真”,包括“0”。

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

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

现在我们假设三个变量

local a = true
local b = true
local c = false

先说“and”

a and b 返回 true(这里的true为b)

然后“or”

true(这里的true为b) or c 返回 true(这里的true为b)

我们再来假设三个变量

local a = false
local b = true
local c = false

先说“and”

a and b 返回 false(这里的false为a)

然后“or”

false(这里的false为a) or c 返回 false(这里的false为c)

所以

ret = a and b or c

当 a 为 true 时 ret = b

当 a 为 false 时 ret = c

这里已经得出一个简单的三目运算符 “a and b or c”,你以为这就完了吗?

但是!

这是基于a的变化 并且 b = true, c = false 的情况

我们重新再来假设三个变量

local a = true
local b = false
local c = true

先说“and”

a and b 返回 false(这里的false为b)

然后“or”

false(这里的false为b) or c 返回 true(这里的true为c)

记下这个返回值

我们叕假设三个变量

local a = false
local b = false
local c = true

先说“and”

a and b 返回 false(这里的false为a)

然后“or”

false(这里的false为a) or c 返回 true(这里的true为c)

所以

ret = a and b or c

当 a 为 true 时 ret = c

当 a 为 false 时 ret = c

是不是发现问题了

无论a是“true”还是“false”最终返回结果都是“c”

这显然不是我们想要的结果,那么问题出在哪里呢?

通过上面拆开的步骤来看,都是出现在了第二次“or”运算当中

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

因为这一条的存在 所以 只要 b = false 不论 第一步 “and” 运算的结果如何 最终 “or” 的 结果 都会指向C

所以我们进一步优化就得出以下

(a and {b} or {c})[1]

这样即使 b = false 但判断的过程中却是判断 “{false}”,就不会影响结果啦。

lua中的三目运算符的更多相关文章

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

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

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

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

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

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

  4. lua中的string类型

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

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

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

  6. lua中的table、stack和registery

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

  7. lua中的协程

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

  8. lua 中的面向对象

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

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

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

随机推荐

  1. Log4j2 消停了,Logback 开始塌房了?

    今天一早,还没起床,拿起手机赫然看到一个头条信息,标题着实让我心理咯噔了一下! 马上起床,直奔官网,看看到底什么问题?塌的有多厉害? 既然是1.2.9版本以下问题,那就直接找到1.2.9版本修复了些啥 ...

  2. 使用.NET 6开发TodoList应用文章索引

    系列导航 使用.NET 6开发TodoList应用(1)--系列背景 使用.NET 6开发TodoList应用(2)--项目结构搭建 使用.NET 6开发TodoList应用(3)--引入第三方日志 ...

  3. JAVA执行cmd命令方法

    package com.cmd; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStre ...

  4. 使用.NET 6开发TodoList应用(8)——实现全局异常处理

    系列导航 使用.NET 6开发TodoList应用文章索引 需求 因为在项目中,会有各种各样的领域异常或系统异常被抛出来,那么在Controller里就需要进行完整的try-catch捕获,并根据是否 ...

  5. 1114 - Easily Readable

    1114 - Easily Readable    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ...

  6. 【.NET 遇上 GraphQL】 ChilliCream 平台介绍

    ChilliCream ChilliCream 是一个开源免费的 GraphQL 平台, 提供了构建.管理, 和访问 GraphQL API 的端到端的解决方案. https://chillicrea ...

  7. 基于内存的关系数据库memsql初探

    背景 广告系统中,算法模型预估需要根据广告的实时转化统计结果,才能做出更精准的预估:同时,支持多维度聚合查询(例如按照广告各个不同层级维度,按照时间不同粒度的维度),并跨大区合并.一开始的版本是基于m ...

  8. InnoDB 聚集索引和非聚集索引、覆盖索引、回表、索引下推简述

    关于InnoDB 存储引擎的有聚集索引和非聚集索引,覆盖索引,回表,索引下推等概念,这些知识点比较多,也比较零碎,但是概念都是基于索引建立的,本文从索引查找数据讲述上述概念. 聚集索引和非聚集索引 在 ...

  9. ZOJ 3785:What day is that day?(数论)

    What day is that day? Time Limit: 2 Seconds Memory Limit: 65536 KB It's Saturday today, what day is ...

  10. 源码解析C#中PriorityQueue(优先级队列)的实现

    前言 前段时间看到有大佬对.net 6.0新出的PriorityQueue(优先级队列)数据结构做了解析,但是没有源码分析,所以本着探究源码的心态,看了看并分享出来.它不像普通队列先进先出(FIFO) ...