• Lua中and、or的一些特殊使用方法


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

    这里要说的是andor的一些特殊使用方法。

    当连接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)

    执行结果:


    以上两点我之前都是硬记的,但发现过了一段时间后就会忘或者弄混,后来自己总结了一个方法记忆,再也不会弄混了。这种方法就是依照andor的逻辑特性来联想记忆


    1).先说and:我们知道and是取与,与就是0 and 0 = 00 and 1 = 01 and 1 = 1,也就是说有一个为0值就为0,全为1表达式值才为1。所以。当and的第一个操作数为0的时候。我们就没有必要看后面的操作数了,此时表达式的值已经为0,我们就把第一个为0的操作数返回即可;假设第一个操作数为1,那么整个表达式的值就取决于第二个操作数了,第二个为0表达式值为0。第二个为1表达式值为1,所以由于第二个操作数是啥表达式值就是啥。那么我们就把第二个操作数返回即可了。


    2).再说or,也是一个道理:or是取或。或就是0 or 0 = 00 or 1 = 11 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,比如选出xy中的较大者。能够使用一下语句:

    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。

     

     

     

     

    以上。

     

     

     

     

     

     

     

     

  • 相关阅读:
    drop table 、delete table和truncate table的区别
    润乾报表 删除导出excel弹出框里的选项
    学习笔记: 委托解析和封装,事件及应用
    学习笔记: 特性Attribute详解,应用封装
    学习笔记: 反射应用、原理,完成扩展,emit动态代码
    学习笔记: 泛型应用、原理、协变逆变、泛型缓存
    jmeter4.x centos7部署笔记
    rabbitmq3.7.5 centos7 集群部署笔记
    rabbitmq3.8.3 centos7 安装笔记
    UVA-12436 Rip Van Winkle's Code (线段树区间更新)
  • 原文地址:https://www.cnblogs.com/llguanli/p/8933811.html
Copyright © 2020-2023  润新知