您的位置:首页 > 编程语言 > Lua

lua学习(4)_____表达式、语句

2016-09-05 02:51 465 查看
前面讲完了lua的基本类型,现在我们来看看lua表达式和语句语法的特别之处。


1.表达式:

讲表达式肯定就要先从操作符入手,其他的语言一般操作符分为算术操作符关系操作符逻辑操作符。不过lua中还有一个字符串连接操作符

先从算术操作符讲起:

lua支持常规的算术操作符有:一元的"-"(负号), 二元的 "+"(加号), "-"(减号), "*"(乘号), "/"(除号), "^"(指数), "%"(取模)。因为lua的数不分实数和整数,所以前面几个算术操作符应该都好理解。这里我主要说说"^"(指数), "%"(取模)。

"^"(指数):顾名思义,a^b计算的就是a的b次方。x^0.5将计算x的算术平方根, x^(-1/3)将计算x立方根的倒数。

"%"(取模):和有的语言的%不一样,a % b == a - floor(a/b)*b 。floor(x) 表示对x向下取整。可以看出来表达式的符号永远和b的符号相同。

如果a,b都是整数,%既是求余,这是好理解的。如果a,b中存在实数呢?其实,a,b都为实数计算a%b的大多数情况下都是没有实用价值的。但是特别的,当x为实数的时候:x%1的结果就是计算x的小数部分,x-x%1就是计算x的整数部分,类似的,x-x%0.01就是计算x精确到小数点后两位的结果。



值得注意的是:在没有通过编码设置下,算术操作符只能用于number类型。至于这些操作符用于其他类型后面我会讲到。


然后是关系操作符

lua提供了一下几个关系操作符:

<  >  <=  >=  ==   ~=(不等于)

所有的这些操作符的运算结果都是true或者false.

除了字符串和数字之外的其他的类型都只能进行相等性和不等性的判断。但是值得注意的是对于table,userdata和函数,lua是作为引用比较。也就是说只有当它们引用同一个对象时,才认为它们相等。例如,以下代码:



当对两个不同类型的值作比较的时候,要格外小心,请记住0和"0"是不同的, 此外 2<15显然是true,但是"2"<"15"却是false。所以当作比较判断的时候一定要注意类型是否一致。


逻辑操作符:

lua中的逻辑操作符有:

      and  、or   和  not

和条件控制语句一样,所有逻辑操作符都将false和nil视为假,其他视为真。

and :对于 x and y 来说,如果 x 为假那么就返回 x 的值,否则就返回 y 的值。

or :对于 x or y 来说,如果 x 为真那么就返回 x 的值,否则就返回 y 的值。

and 和 or 都使用"短路求值",这个跟很多语言都是相似的,是对代码运行的一种时间优化。也就是说它们只有在第二个操作数的真假影响到整个表达式的结果的时候才会求第二个操作数的值。

常见的lua的一种习惯写法是"x=x or v",它等价于 如果 x 为假 那么 x 就赋值为 v 。一般用于 x 如果没有赋值的话,给予x默认初值。

not :永远只返回true或者 or .对操作数逻辑去反。

字符串操作符:

因为在lua中不能用 + 号去连接字符串所以单独设定了一个字符串连接符".."(两个点)。如果其中任意一个操作数为数字的话,lua会将这个数字转化为字符串然后相连。

值得注意的是:lua中的字符串是一个不可变的值,也就意味着当字符串在被创建初始化好后就无法在被改变。那么连接操作符实质上时会创建一个新的字符串。不会对原操作数进行任何修改。

#:后面跟上一个字符串,返回该字符串的长度。顺便说一句,如果table当做数组使用那么#table返回数组的大小(后面会详细讲)。

讲了操作符基本语法,自然就免不了讲操作符的优先级!

Lua操作符的优先级
^
not     #       -
*     /    %
+       -
..
<     >   <=   >=   ~=   ==
and
or
在二元操作符中,除了指数操作符"^"和连接操作符".."是右结合,所有其他操作符都是左结合。
不过建议:对于某些操作符不确定其优先级的时候,就应该显示的给出括号来指定所期望的运算次序。这样可以增加代码可读性。


在Lua中还有一种表达式是用于创建和初始化table的表达式。这也是lua特有的一种表达式,并且也是lua种最有用,最通用的机制之一。不过在这篇文章中,不对这个表达式进行讲解,我们会放到下节详细对table进行介绍。

2.语句:

lua中语句基本上分为:赋值语句声明语句控制结构break和return

我们先来看看赋值语句:

和其他大多数语言一样的是,lua的赋值语句主要也是用来修改变量的值,不过不同的是lua允许"多重赋值",也就是一下子将多个值赋予给多个变量。每个值或者每个变量之间以逗号分隔。例如: a, b = 10, 2*x  。赋值后,变量a为10,b为2*x。

在多重赋值中,lua会先对等号右边的所有元素求值,然后才执行赋值。这样在许多操作中可以极大简化代码。

比如对于交换两个变量的值 :  x, y = x, y  (交换x,y的值)

Lua总是会将等号右边值的个数调整到与左边变量的个数相等。规则是:若值得个数少于变量的个数,那么多余的变量会被赋予nil。若值的个数更多的话,那么多余的值会被丢掉。



多重赋值的应用不仅仅是在这里,更多的是用于函数的多个参数的传递和接受多个返回值。后面我们会仔细介绍的


声明语句不用多说了:主要是区别全局变量和局部变量。在第二节已经简单介绍过了。

然后是控制语句:

控制语句主要分为条件控制循环控制:

条件控制:  if then..else  ..else if ..end



通过以上的例子可以很清晰的了解lua中if条件语句的使用。通过then 和 end 的搭配可以使得其他语言通过{ }来表示的代码块变得简洁。

不过也是需要注意的地方就是不要漏掉 then 和 end 。


至于循环结构while语句repeat语句for语句

while语句:



当<判断表达式>结果为true的时候继续执行循环体直到<判断表达式>结果为false

repeat语句:






先执行一遍<循环体>,然后判断<判断表达式>结果如果为真结束循环,否则继续循环 and 判断。

for循环语句:

 不一样的是,在lua中for语句有两种形式:数字型for泛型for。

数字型for:






var从exp1变化到exp2,每次变化都是以exp3作为步长(step)递增var,并执行一次循环体。不过第三个表达式exp3是可选的,若不指定的话,lua就会将步长默认为1。不过值得注意的是,在lua中 var 作为控制变量是被 lua 封装起来了。也就是说在循环体里面对 var 的修改都是无效的。



所以说其他语言的有些代码在改为lua语言的时候一定要注意这个细节!!


泛型for:

泛型for循环是通过一个迭代器函数来遍历所有值:



Lua的基础库提供了ipairs,这是一个用于遍历数组的迭代器函数。在每次循环中,i会被赋予一个索引值,同时v被赋予一个对应该索引值得数组元素值。

通过从外观上看泛型for比较简单,但其实它是非常强大的。通过不同的迭代器,几乎可以遍历所有东西,而且写出来的代码是极具可读性。标准库提供了几种迭代器,包括用于迭代文件中的每行的(
io.lines() ) 、迭代table元素的( pairs() )、迭代数组元素的(
ipairs()
)、迭代字符串中单词的( string.gmatch() )等等。当然,读者也可以编写自己的迭代器。虽然泛型for使用非常简单,但是编写迭代器函数却有不少细节需要注意。不过这个问题我们丢到后面慢慢来细讲。

 

break 与 return :

这两个关键字在其他语言中应该是老面孔了。而在lua中这两个关键字还是干的自己的老工作。


break 用于跳出包含它的内部循环。

return 语句用于从一个函数值返回结果。

不过值得注意的是:由于lua语法构造的缘故,这两个关键字只能处于在包含它的代码块的最后一句。或者是 end 、else 或者 until 前的一条语句。

因为那些位于return 或者 break 之后的语句将无法执行到,所以通常也只会在上述的几个位置中使用这些语句。当然,有的时候用户可能想在一个块的中间插入一句 return 或者 break (可能是用户想调试这个函数或者循环 )。在这种情况下,可以使用一个显式的 do..end 代码块包住这条语句:



好了,这节的内容基本就讲到这里了,其实仔细看和其他脚本语言很是相似,只不过有的语句会有Lua自己的特色,不过也不难理解。


下节我们会讲table表的简单使用函数的使用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lua学习