c语言中1.5E12是什么?

Lua是一种动态类型的语言。在语言中没有类型定义的语法,每个值都“携带”了它自身的类型信息。

在Lua中有8种基础类型:


如果字符串中有]]字符,例如"a=b[c[i]]",或者可能需要包含已经被注释掉的代码。为了应对这种情况,需要在两个左方括号中间加上任意数量的等号,例如:

经过这样修改后,字符串只有在遇到一个内嵌相同数量等号的双右括号时才会结束。如果一组左右方括号等号数量不等,那么Lua就会忽略它。通过选择适当数量的等号,就可以在不加转义的情况下,直接嵌入任意的字符串内容了。

这套机制同样适用于注释,例如:以"–[=["开始的一个块注释将延伸至“]=]”结束。如此简化了注释那些“已经包含了注释块”的代码,例如:


Lua提供了运行时的数字和字符串的自动转换。在一个字符串上应用算术操作时,Lua会尝试将这个字符串转换成一个数字,例如:

Lua不仅在算术操作中会施以这种强制转换,还会在其他任何需要数字的地方这么做。相反,在Lua期望一个字符串但却得到一个数字是,它也会将数字转换成字符串,例如:

在Lua中,“…”是字符串连接操作符。当直接在一个数字后面输入它的时候,必须要用一个空格来分隔它们,不然,Lua会将第一个点理解为一个小数点。

这种隐式转换最好还是不要依赖它们,虽然在某些地方这些转换显得很便利,但它们也给语言和使用它们的程序带来的复杂性。毕竟,字符串和数字是两种不同的东西。比如运行10=="10"总是false,因为10是一个数字,而"10"是一个字符串。如果需要显示地将一个字符串转换成数字,可以使用函数tonumber()。当这个字符串的内容不能表示一个正确的数字时,tonumber()将返回nil。

若要将一个数字转换成字符串,可以调用函数tostring(),或者将该数字与一个空字符串相连接:

这样的转换永远是合法的。

在Lua5.1中,可以在字符串前放置操作符"#"来获得字符串的长度,例如:


table类型实现了“关联数组”,关联数组是一种具有特殊索引方式的数组。不仅可以通过整数来索引它,还可以使用字符串或其他类型的值(除了nil)来索引它。

table没有固定的大小,可以动态地添加任意数量的元素到一个table中。

table是Lua中最主要的数据结构机制,具有强大的功能。基于table,可以以一种简单、统一和高效的方式来表示普通数组、符号表、集合、记录、队列和其它数据结构。

Lua也是通过table表示模块、包和对象的 。当输入io.read的时候,其含义是“io模块中的read函数”。对于Lua而言,这表示“使用字符串"read”作为key(键)来索引table.io"。

在Lua中,table既不是“值”,也不是“变量”,而是“对象”。可以将一个table想象成一种动态分配的对象,程序仅持有一个对它们的引用(或指针),Lua不会暗中产生table的副本或创建新的table。

table的创建是通过“构造表达式”完成的,最简单的构造表达式就是{},例如:

table永远是“匿名的”,一个持有table的变量与table自身之间没有固定的关联性。

当一个程序再也没有对一个table的引用时,Lua的垃圾收集器最终会删除该table,并复用它的内存。

所有的table都可以用不同类型的索引来访问value,当需要容纳新条目时,table会自动增长。

当table的某个元素没有初始化时,它的内容就为nil。另外还可以像全局变量一样,将nil赋予table的某个元素来删除该元素。

为了表示一条记录,可以将字段名作为索引。Lua对于诸如a[“name”]的写法提供了一种更简便的“语法糖”,可以直接输入a.name

对于Lua来说,这两种形式是等价的,可供自由使用。然而这两种形式对于一个读者来说,可能就暗示了不同的意图。点的写法可能更明确地暗示了读者,将table作为一条记录来使用,每条记录都有一组固定的、预定义的key。而字符串的写法可能暗示了该table会以任何字符串作为key,二现在出于某些原因,需要访问某个特定的key。

初学者常会将a.x和a[x]搞错,前者表示a[“x”],表示以字符串“x”来索引table,而后者是以变量x的值来索引table,例如:

若要表示一个传统的数组或线性表,只需以整数作为key来使用table即可,直接初始化元素就可以了,例如:


虽然可以用任何值作为一个table的索引,也可以用任何数字作为数组索引的起始值。但就Lua的习惯而言,数组通常以1作为索引的起始值。并且还有不少几只依赖于这个惯例。

在Lua 5.1中,长度操作符“#”用于返回一个数组或线性表的最后一个索引值(或为其大小),例如:


以下是几种长度操作符在Lua中的习惯写法:

由于数组实际是一个table,所以关于其大小的概念可能会有些模糊。table中对于所有为初始化的元素的索引结果都是nil,Lua将nil作为界定数组结尾的标志。当一个数组有“空隙”时(即中间含有nil时),长度操作符会认为这些nil元素就是结尾标记。因此如果需要处理那些含有“空隙“的数组,使用长度操作符就不安全了,可以使用函数table.maxn,它将返回table的最大正索引数。

由于可以用任何类型的值来索引table,因此可能会遇到一些看似相同,但却实际不同的索引方式。例如:可以用数字0和字符串“0”来索引一个table,这两个索引值是不同的,因此也就表示了table中两个不同的条目。与此类似的还有字符串“+1”、“01”和“1”,这些都表示了不同的条目。当对索引的实际类型不是很确定时,可以明确地使用一个显示转换:


在Lua中,函数是作为“第一类值”来看待的,这表示函数可以存储在变量中,可以通过参数传递给其他函数,还可以作为其他函数的返回值。

这种特性是语言具有极大的灵活性,为了给一个函数添加新的功能,程序可以冲的定义该函数。而在运行一些不受信任的代码时,可以先删除某些函数,从而创建一个安全的运行环境。

此外,Lua对“函数式编程”也提供了良好的支持。例如,允许在某些词法域中编写嵌套的函数。

Lua既可以调用以自身Lua语言编写的函数,又可以调用以C语言编写的函数。Lua所有的标准库都是用C语言写的,标准库中包括对字符串的操作、table的操作、I/O、操作系统的功能调用、数学函数和调试函数。同样,应用程序也可以用C语言来定义其他函数。


由于userdata类型可以将任意的C语言数据存储到Lua变量中。在Lua中,这种类型没有太多的预定义操作,只能进行赋值和相等性测试。userdata用于表示一种应用程序或C语言库所创建的新类型,例如标准的I/O库就是userdata来表示文件。


我要回帖

更多关于 c语言中double类型的数怎么输出 的文章

 

随机推荐