Flex3.0 RIA开发详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第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中常见运算符和表达式的特性及使用方法。