• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >嵌入式开发 > lua.dlllua函数条件与返回的区别是什么?

lua.dlllua函数条件与返回的区别是什么?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了lua函数库,lua时间函数,lua 函数调用,lua 匿名函数,lua 闭包函数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:lua.dll lua 函数条件与返回的区别是什么?
描述:

1.

function dum(t)
  if t then return 1 end
  return 0
end

2.

function dum(t)
  if t then return 1 else return 0 end
end

上面两个函数在功能上是一样的,只是实现上有一些差别。

疑惑是

  1. 它们在语义上是否有差别?
  2. 它们在编译器中的实现方式是否相同?
  3. 在逻辑上,这两个函数是否完全一致?

希望能够能得到详解。谢谢!


解决方案1:

有一小点点区别,我这里先说一下查看Lua(我指的是其官方实现)汇编的方法吧。
用luac -l src.lua就可以在stdout上打印出src.lua生成的Lua VM字节码,并且是已经反汇编好了的。有了这个小技巧,我们就可以开始之后的讨论了。
我把你的这两个函数分别改名为dum1()和dum2(),顺带帮你写了个dum3(),程序内容和Lua反汇编结果如下:

? ~/ cat -n test.lua
     1  function dum1(t)
     2          if t then return 1 end
     3          return 0
     4  end
     5
     6  function dum2(t)
     7          if t then return 1 else return 0 end
     8  end
     9
    10  function dum3(t)
    11          return t and 1 or 0
    12  end
    13      
? ~/ luac -l test.lua

main <test.lua:0,0> (7 instructions at 0x7f85f1405a00)
0+ params, 2 slots, 1 upvalue, 0 locals, 3 constants, 3 functions
        1       [4]     CLOSURE         0 0     ; 0x7f85f1405c40
        2       [1]     SETTABUP        0 -1 0  ; _ENV "dum1"
        3       [8]     CLOSURE         0 1     ; 0x7f85f1405fe0
        4       [6]     SETTABUP        0 -2 0  ; _ENV "dum2"
        5       [12]    CLOSURE         0 2     ; 0x7f85f14060e0
        6       [10]    SETTABUP        0 -3 0  ; _ENV "dum3"
        7       [12]    RETURN          0 1

function <test.lua:1,4> (7 instructions at 0x7f85f1405c40)
1 param, 2 slots, 0 upvalues, 1 local, 2 constants, 0 functions
        1       [2]     TEST            0 0
        2       [2]     JMP             0 2     ; to 5
        3       [2]     LOADK           1 -1    ; 1
        4       [2]     RETURN          1 2
        5       [3]     LOADK           1 -2    ; 0
        6       [3]     RETURN          1 2
        7       [4]     RETURN          0 1

function <test.lua:6,8> (8 instructions at 0x7f85f1405fe0)
1 param, 2 slots, 0 upvalues, 1 local, 2 constants, 0 functions
        1       [7]     TEST            0 0
        2       [7]     JMP             0 3     ; to 6
        3       [7]     LOADK           1 -1    ; 1
        4       [7]     RETURN          1 2
        5       [7]     JMP             0 2     ; to 8
        6       [7]     LOADK           1 -2    ; 0
        7       [7]     RETURN          1 2
        8       [8]     RETURN          0 1

function <test.lua:10,12> (8 instructions at 0x7f85f14060e0)
1 param, 2 slots, 0 upvalues, 1 local, 2 constants, 0 functions
        1       [11]    TEST            0 0
        2       [11]    JMP             0 3     ; to 6
        3       [11]    LOADK           1 -1    ; 1
        4       [11]    TEST            1 1
        5       [11]    JMP             0 1     ; to 7
        6       [11]    LOADK           1 -2    ; 0
        7       [11]    RETURN          1 2
        8       [12]    RETURN          0 1

从实际的运行效果来说,这3个版本的dum()都是一样的(如果t不是false或者nil就返回1,否则返回0),但是实际运行起来略有一小点差别:dum3()会比前两个版本要多执行一个判断(因为Lua编译器没做什么优化,所以那个1还是要判断一下的)。dum1()和dum2()之间虽然后者比前者多编译出了一条JMP语句,但是由于这条JMP语句是在RETURN之后的,所以并不会影响程序实际的运行流程。
总结起来就是,这3个版本的dum()语义没有差别,运行的结果也一样,但是编译出来的语句略有差别:其中dum1()和dum2()运行流程一致,dum3()会多对常数1进行判断。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • lua.dlllua函数条件与返回的区别是什么?

相关文章

  • 2017-06-05 mxArray[]数据类型在LabVIEW里怎么适配啊?
  • 2017-06-05 m4的板子怎么接收来自空气质量传感器采集的数据
  • 2017-06-05 浏览器输入baiducom就会闪一下其他的网址
  • 2017-06-05 磁盘驱动是不是仍需调用int13对系统磁盘进行读写(ide驱动或者scsi驱动等)
  • 2017-06-05 智能硬件应该如何学习
  • 2017-06-05 请问哪里有最新WINDOWS2000DDK下载?谢谢!
  • 2017-06-05 cgi没能成功加载css文件和js文件的问题
  • 2017-06-05 驱动程序开发的第一个问题
  • 2017-06-05 求eMbeddedVisualTools
  • 2017-06-05 关于QT的问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 关于vs1003和ds1302的sclk引脚
    • 关于通过串口向单片机发送十六进制数组指令,求大神指点!
    • 有人做过5509的USB驱动吗?
    • 本人最近在做驱动(ds),希望能同大家交流心得。
    • WDK81+VS2013开发驱动遇到安装问题
    • dns服务器配置DNS跳转要如何配置
    • 如何理解操作系统与安装(运行)在操作系统上的软件的关系
    • 嵌入式软件开发大讨论:技术水平一般的嵌入式开发人员的工资能否达到6K以上?干嵌入式能干到几岁?
    • 驱动返回的HANDLE,与应用程序调用操作系统产生的HANDLE,是不是一码事?
    • 关于STM32系列单片机I2C通信的问题,求教各位大牛

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有