第5章 运算符和表达式
ActionScript 3.0语言中运算符和表达式很多。丰富的运算符和表达式使ActionScript 3.0语言功能强大。ActionScript 3.0语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约:到底是自左向右进行运算还是自右向左进行运算。这种结合性增加了ActionScript 3.0语言的复杂性。
表达式是由常量、变量、函数和运算符组合起来的式子。一个表达式有一个值及其类型,相当于表达式所得结果的值和类型。表达式求值按运算符的优先级和结合性规定的顺序进行。单个的常量、变量、函数可以看做是表达式的特例。
由于表达式是由运算符连接起来的式子,所以表达式与运算符的关系很紧密。表达式中使用的运算符决定了表达式的运算特性。
5.1 ActionScript 3.0运算符简介
ActionScript 3.0语言的运算符可分为以下几类:
1.算术运算符用于各类数值运算。包括加“+”、减“-”、乘“*”、除“/”、求余“%”、自增“++”、自减“--”,共7种。
2.关系运算符用于比较运算。包括大于“>”、小于“<”、等于“==”、大于等于“>=”、小于等于“<=”和不等于“!= ”,共6种。
3.逻辑运算符用于逻辑运算。包括与“&&”、或“||”、非“! ”,共3种。
4.位操作运算符用于二进制位运算。包括位与“&”、位或“|”、位非“~”、位异或“^”、左移“<<”、右移“>>”,共六种。
5.赋值运算符用于赋值运算。分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类,共11种。
6.条件运算符用于条件求值。运算符为“?:”。
7.逗号运算符用于把若干表达式组合成一个表达式。运算符为“,”。
8.特殊运算符,如括号“()”,下标“[]”,取XML属性“@”等。
5.2 算术运算符和算术表达式
算术运算符是用来进行算术运算的操作符,是ActionScript 3.0中最基本的运算符。使用算术运算符连接的表达式称为算术表达式。
5.2.1 基本的算术运算符
基本的算术运算符包括:
1.加法运算符“+”:加法运算符为双目运算符,表示两个量相加,具有右结合性。
2.减法运算符“-”:减法运算符为双目运算符,表示两个量相减运算,具有右结合性。“-”也可作负值运算符,此时为单目运算,如-x、-5等。
3.乘法运算符“*”:乘法运算符为双目运算,表示两个量相乘,具有左结合性。
4.除法运算符“/”:除法运算符为双目运算,表示两个量相除,具有左结合性。若参与运算的两个量均为整型时,结果也为整型。若运算的两个量中有一个是实型,则结果为实型。以下代码说明整型相除与实型相除的不同。
trace((20/7).toString()+","+(-20/7).toString()); trace((20.0/7).toString()+","+(-20.0/7).toString());
本例中,20/7,-20/7的结果均为整型。而20.0/7和-20.0/7由于有实型参与运算,因此结果也为实型。
5.求余运算符“%”:求余运算符为双目运算,表示两个量相除求余数,具有左结合性。求余运算符要求参与运算的两个量均为整型。
以下代码说明求余运算的结果。
trace((100%3).toString());
本例输出100除以3所得的余数1。
5.2.2 算术表达式
算术表达式是用算术运算符和括号将运算对象(也称操作数)连接起来的,符合ActionScript 3.0语法规则的式子。以下是合法的算术表达式。
a+b (a*2)/c (x+r)*8-(a+b)/7 ++i Math.sin(x)+Math.sin(y) (++i)-(j++)+(k--)
5.2.3 运算符的优先级和结合性
ActionScript 3.0语言中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式中,优先级较高的先于优先级较低的进行运算。若两个运算符优先级相同,按运算符的结合性所规定的方向处理。
ActionScript 3.0语言中各运算符的结合性有两种:左结合性(自左至右)和右结合性(自右至左)。例如,若算术运算符的结合性是自左至右,如表达式x-y+z,则y应先与“-”号结合,执行x-y运算,然后再执行+z的运算。这种自左至右的结合方向就称为“左结合性”。反之,自右至左的结合方向称为“右结合性”。最典型的右结合性运算符是赋值运算符,如表达式x=y=z,由于“=”的右结合性,应先执行y=z,再执行x=(y=z)运算。ActionScript 3.0语言运算符中有不少为右结合性运算符,应注意区别,以免错误。
5.2.4 自增、自减运算符
自增、自减运算符是ActionScript 3.0中比较常用的运算符,用于变量自增或自减。自增运算符为“++”,功能是使变量的值自增1。自减运算符为“--”,其功能是使变量值自减1。自增运算符和自减运算符为单目运算(只对一个变量操作运算),可有以下四种形式。
(1)++i:i自增1后再参与其他运算。
(2)--i:i自减1后再参与其他运算。
(3)i++:i参与运算后,i的值再自增1。
(4)i--:i参与运算后,i的值再自减1。
以下代码中说明了使用自增、自减运算符应注意的细微区别。
var i:int=8; trace((++i).toString()); trace((--i).toString()); trace((i++).toString()); trace((i--).toString()); trace((-i++).toString()); trace((-i--).toString());
i的初值为8,第2行i加1后输出故为9;第3行减1后输出故为8;第4行输出i为8之后再加1(为9);第5行输出i为9之后再减1(为8);第6行输出-8之后再加1(为9),第7行输出-9之后再减1(为8)。
以下代码说明了++i和i++这两种自增方式的不同。
var i:int=5,j:int=5,p:int,q:int; p=(i++)+(i++)+(i++); q=(++j)+(++j)+(++j); trace(p.toString()+","+q.toString()+","+i.toString()+","+j.toString());
这个程序中,对P=(i++)+(i++)+(i++)应理解为三个i相加,故P值为15。然后i再自增1三次相当于加3,故i的最后值为8。对于q的值则不然,q=(++j)+(++j)+(++j)应理解为q先自增1,再参与运算,由于q自增1三次后值为8,三个8相加的和为24,j的最后值仍为8。
5.3 关系运算符和关系表达式
关系运算符是用来对两个量之间的关系进行运算的操作符。使用关系运算符连接的表达式称为关系表达式。
5.3.1 关系运算符
在ActionScript 3.0语言中有以下关系运算符:
(1)< 小于
(2)<= 小于或等于
(3)> 大于
(4)>= 大于或等于
(5)== 等于
(6)!= 不等于
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中“<”、“<=”、“>”、“>=”的优先级相同,高于“==”和“!=”,“==”和“!=”的优先级相同。
5.3.2 关系表达式
关系表达式使用关系运算符连接其他对象,其一般形式为:
表达式 关系运算符 表达式
以下表达式都是合法的关系表达式。
a+b>c-d x>3/2 "a"+1<c -i-5*j==k+1
由于表达式可以又是关系表达式,就会出现嵌套的情况。
以下表达式也是合法的关系表达式。
a>(b>c) a!=(c==d)
关系表达式的值是“真”和“假”,分别用“1”和“0”表示。例如,5>0的值为“真”,即为1。(a=3)>(b=5)结果为0。因为3>5不成立,故其值为“假”。
以下代码中使用了各种关系表达式。
var i:int=1,j:int=2,k:int=3; var x:Number=3e+5,y:Number=0.85; trace((-i-2*j>=k+1).toString()); trace((1<j<5).toString()+","+(x-5.25<=x+y).toString()); trace((i+j+k==-2*j).toString()+","+( k==j==i+5).toString());
在本例中计算各种关系运算的值。对于含多个关系运算符的表达式,如k==j==i+5,需要根据运算符结合性。这里先计算k==j,该式不成立,其值为0。再计算0==i+5,也不成立,故表达式值为0。
5.4 逻辑运算符和逻辑表达式
逻辑运算符是用来进行逻辑运算的操作符,包括与、或、非运算。使用逻辑运算符连接的表达式称为逻辑表达式。
5.4.1 逻辑运算符
ActionScript 3.0语言中提供了三种逻辑运算符:
(1)&& 与运算
(2)|| 或运算
(3)! 非运算
与运算符“&&”和或运算符“||”均为双目运算符,具有左结合性。非运算符“!”为单目运算符,具有右结合性。逻辑运算符和其他运算符优先级的关系如图5-1所示。
图5-1 逻辑运算符及其他运算符的优先级关系
按照运算符的优先级顺序可以得出运算次序。以下代码说明了运算符的优先顺序。
a>b && c>d 等价于 (a>b)&&(c>d) !b==c||d<a 等价于 ((!b)==c)||(d<a) a+b>c&&x+y<b 等价于 ((a+b)>c)&&((x+y)<b)
5.4.2 逻辑运算的值
逻辑运算的值只有“真”和“假”两种,可用“1”和“0 ”来表示。求值规则如下:
(1)与运算“&&”:参与运算的两个量都为真时,结果才为真,否则为假。
以下代码说明与运算规则。
trace(5>0 && 4>2);
由于5>0为真,4>2也为真,相与的结果也为真。
(2)或运算“||”:参与运算的两个量只要有一个为真,结果就为真。两个量都为假时,结果为假。
以下代码说明与运算规则。
trace(5>0||5>8);
由于5>0为真,相或的结果也就为真。
(3)非运算“!”:参与运算的量为真时,结果为假;参与运算量为假时,结果为真。
以下代码说明非运算规则。
trace(!(5>0));
由于5>0为真,非运算后结果为假。
在ActionScript 3.0中判断一个量是“真”还是“假”时,以“0”代表“假”,以非“0”代表“真”。例如,5&&3的结果为1。因为5和3均为非“0”,所以与运算的结果为“真”。
5.4.3 逻辑表达式
使用逻辑运算符连接式子就得到逻辑表达式,逻辑表达式的一般形式为:
表达式 逻辑运算符 表达式
其中的表达式可以是逻辑表达式,从而组成了嵌套的情形。以下代码是一个嵌套的逻辑表达式。
(a&&b)&&c
根据逻辑运算符的左结合性,上式相当于a&&b&&c。逻辑表达式的值是式中各种逻辑运算的最后值,以“1”代表“真”,以“0”代表“假”。以下代码中使用了不同的逻辑表达式,但结果只有“0”或“1”。
var c:String="k"; var i:int=1,j:int=2,k:int=3; var x:Number=3e+5,y:Number=0.85; trace((!x*!y).toString()+","+(!!!x).toString()); trace((x||i&&j-3).toString()+","+(i<j&&x<y).toString()); trace((i==5&&c&&(j=8)).toString()+","+( x+y||i+j+k).toString());
本例中,!x和!y均为0,!x*!y也为0,故其输出值为0。由于x为非0,故!!!x的逻辑值为0。对于x|| i && j-3,先计算j-3的值为非0,再求i &&j-3的逻辑值为1,故x||i&&j-3的逻辑值为1。对于i<j&&x<y,由于i<j的值为1,而x<y为0,故表达式的值为1。对于i==5&&c&&(j=8),由于i==5为0,两次与运算后整个表达式的值为0。对于式x+ y||i+j+k,由于x+y的值为非0,故整个或表达式的值为1。
5.5 赋值运算符和赋值表达式
赋值运算符包括简单的赋值运算符“=”和复合赋值运算符,如“+=”、“-=”等。使用赋值运算符连接的表达式称为赋值表达式。
5.3.1 简单赋值运算符和简单赋值表达式
简单赋值运算符为“=”。由“= ”连接的式子称为赋值表达式。其一般形式为:
标识符=表达式
以下各表达式为合法的赋值表达式。
x=a+b w=Math.sin(a)+Math.sin(b) y=i+++--j
赋值运算符“=”具有右结合性。因此
a=b=c=5
可理解为:
a=(b=(c=5))
以下代码使用了赋值表达式。
x=(a=5)+(b=8);
代码中把5赋予a,8赋予b,再把a,b相加,结果赋予x,故x应等于13。
5.3.2 复合赋值运算符和复合赋值表达式
在赋值符“=”之前加上其他二目运算符可构成复合赋值符,如“+=”、“-=”、“*=”、“/=”、“%=”、“<<=”、“>>=”、“&=”、“^=”、“|=”。
使用复合赋值运算符连接的式子称为复合赋值表达式,其一般形式为:
变量 复合赋值运算符=表达式
相当于:
变量=变量 运算符 表达式
以下代码定义了复合赋值表达式。
a+=5 等价于a=a+5 x*=y+7 等价于x=x*(y+7) r%=p 等价于r=r%p
复合赋值符这种写法十分有利于编译处理,能提高编译效率并产生质量较高的目标代码。
5.6 逗号运算符和逗号表达式
在ActionScript 3.0语言中逗号“,”也是一种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。
其一般形式为:
表达式1,表达式2
其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。
以下代码中使用了逗号运算符。
var a:int=2,b:int=4,x:int,y:int; y=(x=a+b),(b+c); trace(y.toString()+","+x.toString());
此代码中y的值等于表达式2的值,即(b+c)的值。x的值等于表达式1的值,即(a+b)的值。
对于逗号表达式还要说明两点:
1.逗号表达式可以嵌套,即表达式1或表达式2又是逗号表达式。
形如:
表达式1,(表达式2,表达式3)
相当于:
表达式1,表达式2,…表达式n
2.整个逗号表达式的值等于表达式n的值。但并不是在所有出现逗号的地方都组成逗号表达式。例如,在变量定义中、函数参数中,逗号只是用作各变量之间的间隔符。
5.7 位运算符
位运算指对二进制数的位进行运算。ActionScript 3.0语言提供了位运算的功能,这使得ActionScript 3.0语言也能像汇编语言一样用来编写系统程序。
ActionScript 3.0语言提供了六种位运算符:
(1)& 按位与
(2)| 按位或
(3)^ 按位异或
(4)~ 取反
(5)<< 左移
(6)>> 右移
1.按位与运算
按位与运算符“&”是双目运算符,其功能是把参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。
9&5可写算式如下:
00001001 (9的二进制补码) &00000101 (5的二进制补码) 00000001 (1的二进制补码)
所以9&5=1。
按位与运算通常用来对某些位清0或保留某些位。例如,把a的高八位清0,保留低八位,可作a&255运算(255 的二进制数为0000000011111111)。
9&5的代码实现如下所示。
function main():void { var a:int=9,b:int=5,c:int; c=a&b; trace("a="+a.toString()+"\nb="+b.toString()+"\nc="+c.toString()+"\n"); }
2.按位或运算
按位或运算符“|”是双目运算符,其功能是把参与运算的两数各对应的二进位相或。只要对应的两个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
9|5可写算式如下:
00001001 |00000101 00001101 (十进制为13)
所以9|5=13。
9|5的代码实现如下所示。
function main():void { var a:int=9,b:int=5,c:int; c=a|b; trace("a="+a.toString()+"\nb="+b.toString()+"\nc="+c.toString()+"\n"); }
3.按位异或运算
按位异或运算符“^”是双目运算符,其功能是参与运算的两数各对应的二进位相异或。当两对应的二进位相异时,结果为1。参与运算数以补码出现。
9^5可写成算式如下。
00001001 ^00000101 00001100 (十进制为12)
9^5的代码实现如下所示。
function main():void { var a:int=9; a=a^5; trace("a="+a.toString()); }
4.求反运算
求反运算符“~”为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。
~9的运算为:
~(0000000000001001)
结果为:1111111111110110。
5.左移运算
左移运算符“<<”是双目运算符,其功能把“<< ”左边的运算数的各二进位全部左移若干位。移动过程中高位丢弃,低位补0。
下例中变量a左移4位。
var a:int=3; a<<4;
本例中把a的各二进位向左移动4位。a=00000011(十进制3),左移4位后为00110000(十进制48)。
6.右移运算
右移运算符“>>”是双目运算符。其功能是把“>>”左边的运算数的各二进位全部右移若干位。
下例中变量a右移2位。
var a:int=15; a>>2
本例中把000001111(十进制15)右移2位,变为00000011(十进制3)。
5.8 小结
ActionScript 3.0中定义了许多运算符,这使得ActionScript 3.0语言具有强大的运算能力。运算表达式是由运算符连接起来的式子,其运算方式及结果与运算符的特性紧密相关。
本章主要介绍了算术运算符、关系运算符、逻辑运算符、赋值运算符和位运算符。算术运算符中详细介绍了各种基本的算术运算符、逗号表达式及自增、自减运算符。关系运算符用以比较两个量之间的关系。逻辑运算符中包括与、或、非运算符。赋值运算符包括简单的赋值运算符“=”和复合赋值运算符。位运算符中介绍了六种位运算符的特点及使用方法。
经过本章的学习,读者能掌握ActionScript 3.0中常见运算符和表达式的特性及使用方法。