首页 理论教育 Java程序设计-运算符与表达式

Java程序设计-运算符与表达式

时间:2023-11-26 理论教育 版权反馈
【摘要】:关系运算符的操作结果是布尔类型的,即如果运算符对应的关系成立,则关系表达式结果为true,否则为false。Java中逻辑运算符共有6种,5个二元运算符和1个一元运算符。

Java程序设计-运算符与表达式

Java的运算符与C基本相同,C语言中提供的运算符几乎完全适合于Java,但有两方面不同。一是,Java是强类型语言,其类型限制比C语言严格,表现在表达式上就是运算符的操作对象类型会受到更多的限制。二是,C语言提供的指针运算符等,在Java中不再提供,而Java增加了对象运算符“instanceof”、字符串运算符“+”和零填充的右移“>>>”等。

1.概述

Java中,运算符可以分为如下的类别:算术运算符、关系和条件运算符、位运算符、逻辑运算符和赋值运算符。

算术运算符:+,−,*,/,%,++,−−。

关系运算符:>,>=,<,<=,==,!=。

逻辑运算符:&,|,!,^,&&,||。

赋值运算符:=,+=,−=,*=,/=,%=,&=,|=,^=,<<=,>>=,>>>=。

在上面的赋值运算符中,除了赋值操作符“=”外,其他的运算符是由算术、关系或逻辑运算符和赋值操作符“=”两部分复合而成。这类运算符称为扩展赋值运算符。比如运算符“+=”,由算术运算符“+”与赋值操作符“=”组成。

另外,赋值运算符遵循从右向左的结合性。例如,a=b=c=5等价于a=(b=(c=5));a=5+(c=6)−(d=2)的执行结果是d=2,c=6,a=9。

2.算术运算符和算术表达式

算术表达式由操作数和算术运算符组成。在算术表达式中,操作数只能是整型浮点型。Java的算术运算符有两种:二元算术运算符一元算术运算符

二元算术运算符涉及两个操作数,共有5种:+、−、*、/、%,如表2-5所示。这些算术运算符适用于所有数值型数据类型。

表2-5 二元算术运算符

978-7-111-44824-2-Part01-55.jpg

整型、浮点型经常进行混合运算。运算中,不同类型的数据先转换为同一类型,然后进行运算。这种转换是按照如下优先关系自动进行的:

978-7-111-44824-2-Part01-56.jpg

按照这种优先级关系,在混合运算中低级数据转换为高级数据时,将会自动进行类型转换。转换规则如表2-6所示。

表2-6 低级数据向高级数据的自动转换规则

978-7-111-44824-2-Part01-57.jpg

注意:

●即使两个操作数全是byte型或short型,表达式的结果也是int型。

●“/”运算和“%”运算中除数为0时,会产生异常。

●与C和C++不同,取模运算符“%”的操作数可以为浮点数,例如9.5%3=0.5。

●“+”运算符可以用来连接字符串,例如:

978-7-111-44824-2-Part01-58.jpg

则title的值为Dr.Peter Symour。

下面给出一些混合算术运算的例子,如表2-7所示。

表2-7 混合算术运算示例

978-7-111-44824-2-Part01-59.jpg

(续)

978-7-111-44824-2-Part01-60.jpg

一元算术运算符涉及的操作数只有一个,共有4种:+,−,++,−−。各种一元算术运算符、用法以及功能如表2-8所示。

表2-8 一元算术运算符

978-7-111-44824-2-Part01-61.jpg

下面举一个一元算术运算符使用的例子,注意i++与++i之间的区别。

【例2-6】一元算术运算符的使用。

978-7-111-44824-2-Part01-62.jpg

程序运行结果如下:

978-7-111-44824-2-Part01-63.jpg

978-7-111-44824-2-Part01-64.jpg

另外,Java中没有幂运算符,必须采用java.lang.Math类的方法pow()。该方法定义如下:

978-7-111-44824-2-Part01-65.jpg

java.lang.Math类提供了大量科学和工程函数。例如,pi和e都分别有常熟表示,而且为双精度类型,非常精确。Math类包含了平方根自然对数、乘幂、三角函数等科学函数。另外,它包含了一些基本方法,例如可对浮点数进行四舍五入运算的round()方法,计算同样类型两个数字的最大值和最小值的方法max()和min(),计算绝对值的方法abs()等。

3.关系运算符与关系表达式

关系运算符用来比较两个操作数,由两个操作数和关系运算符构成一个关系表达式。关系运算符的操作结果是布尔类型的,即如果运算符对应的关系成立,则关系表达式结果为true,否则为false。关系运算符都是二元运算符,共有6种,如表2-9所示。例如:

978-7-111-44824-2-Part01-66.jpg

表2-9 关系运算符

978-7-111-44824-2-Part01-67.jpg

Java中,任何类型的数据(包括基本数据类型和复合类型)都可以通过“==”或“!=”来比较是否相等(这与C、C++不同)。

4.逻辑运算符与逻辑表达式

逻辑表达式由逻辑型操作数和逻辑运算符组成。一个或多个关系表达式可以进行逻辑运算。Java中逻辑运算符共有6种,5个二元运算符和1个一元运算符。这些运算符及其使用方法、功能与含义如表2-10所示。

表2-10 逻辑运算符

978-7-111-44824-2-Part01-68.jpg

表2-10中,有两种“与”和“或”的运算符:&&、||和&、|。这两种运算符的运算过程有所差别。

●&&、||分别称为短路与、短路或运算。之所以用“短路”来修饰“与”和“或”运算是因为在表达式求值过程中先求出运算符左边的表达式的值,对于或运算如果为true,则整个布尔逻辑表达式的结果确定为true,从而不再对运算符右边的表达式进行运算。这与电学中的短路是相似的。同样对于与运算,如果左边表达式的值为false,则不再对运算符右边的表达式求值,整个布尔逻辑表达式的结果已确定为false。

●&、|分别称为不短路与、不短路或运算,即不管第一个操作数的值是true还是false,仍然要把第二个操作数的值求出,然后进行逻辑运算,求出表达式的值。

5.位运算符

对于任何一种整数类型的数值,可以直接使用位运算符对这些组成整型的二进制位进行操作。这意味着可以利用屏蔽和置位技术来设置或获得一个数字中的单个位或几位,或者将一个位模式向右或向左移动。由位运算符和整型操作数组成位运算表达式。

位运算符分为位逻辑运算符移位运算符

(1)位逻辑运算符

位逻辑运算符有3个二元运算符和1个一元运算符。二元运算在两个操作数的每个对应位上进行相应的逻辑运算。一元运算是对操作数按位进行相应的运算。位逻辑运算符以及操作规则如表2-11所示。表2-12给出了位逻辑运算&、|、^的表达式取值规则。

表2-11 位逻辑运算符的操作规则

978-7-111-44824-2-Part01-69.jpg(www.xing528.com)

表2-12 位逻辑运算表达式取值规则

978-7-111-44824-2-Part01-70.jpg

按位取反运算符“~”对数据的每个二进制位取反,即把1变为0,把0变为1。

下面是几个位逻辑运算的例子:

00101101&01001111=00001101

00101101|01001111=01101111

00101101^01001111=01100010

~01001111=10110000

(2)移位运算符

Java使用补码来表示二进制数,因此移位运算都是针对整型数二进制补码进行的。在补码表示中,最高位为符号位,正数的符号位为0,负数的为1。补码的规定如下:

●对正数来说,最高位为0,其余各位代表数值本身(以二进制表示),例如+42的补码为00101010。

●对负数而言,把该数绝对值的补码按位取反,然后对整个数加1,即得该数的补码。例如,−1的补码为11111111(−1绝对值的补码为00000001,按位取反再加1为11111110+1−11111111)。用补码来表示数,0的补码是唯一的,都为00000000。

移位运算符把它的第一个操作数向左或向右移动一定的位数。Java中的移位运算符及其操作的描述如表2-13所示。

表2-13 移位运算符

978-7-111-44824-2-Part01-71.jpg

1)右移运算中右移一位相当于除2取商;在不产生溢出的情况下,左移一位相当于乘2。用移位运算实现乘、除法比执行乘、除法的速度要快。例如:

−256>>4结果是−256/24=−16

128>>1结果是128/2=64

−16<<2结果是-16*22=-64

128<<1结果是128*2=256

2)右移运算符>>和>>>之间的区别如下:

●称“>>”为带符号的右移:进行向右移位运算时,最高位移入原来高位的值,即移位操作是对符号位的复制,例如:

1010…>>2结果是111010…

●称“>>>”为无符号右移:进行向右移位运算时,最高位以0填充。例如:

1010…>>>2结果是001010…

3)逻辑运算的运算符:&、|、^和位逻辑运算的运算符&、|、^相同。实际运算时根据操作数的类型判定进行何种运算。如果操作数的类型是boolean,则进行逻辑运算;如果操作数的类型是整数类型,则进行位逻辑运算。

下面是移位运算的例子。

【例2-7】设

1357=00000000,00000000,00000101,01001101

−1357=11111111,11111111,11111010,10110011

则有:

1357>>5=00000000,00000000,00000000,00101010

−1357>>5=11111111,11111111,11111111,11010101

1357>>>5=00000000,00000000,00000000,00101010

−1357>>>5=00000111,11111111,11111111,11010101

1357<<5=00000000,00000000,10101001,10100000

−1357<<5=11111111,11111111,01010110,01100000

6.赋值运算符和赋值表达式

赋值表达式由变量、赋值运算符和表达式组成。赋值运算符把一个表达式的值赋给一个变量。赋值运算符分为赋值运算符“=”和扩展赋值运算符两种。在赋值运算符两侧的类型不一致的情况下,如果左侧变量类型的级别高,则右侧的数据被转化为与左侧相同的高级数据类型后赋给左侧变量;否则,需要使用强制类型转换运算符。例如:

978-7-111-44824-2-Part01-72.jpg

在赋值运算符“=”前加上其他运算符“operator”,即构成扩展赋值运算符“operator=”。其意义

978-7-111-44824-2-Part01-73.jpg

等价于

978-7-111-44824-2-Part01-74.jpg

例如a+=6等价于a=a+6,b%=6等价于b=b%6。

表2-14列出了Java中的扩展赋值运算符及等价的表达式。扩展赋值运算符的特点是可以使程序表达简洁,还能提高程序的编译速度。

表2-14 Java中的扩展赋值运算符及等价的表达式

978-7-111-44824-2-Part01-75.jpg

7.其他运算符

Java支持的其他运算符、使用方法与功能描述如表2-15所示。

表2-15 其他运算符

978-7-111-44824-2-Part01-76.jpg

8.运算符的优先级和结合性

具有两个或两个以上运算符的复杂表达式在进行运算时,要按运算符的优先顺序依次从高到低进行。除了赋值运算符和条件运算符外,同级的运算符按从左到右的方向进行运算。我们称这些运算符具有左结合性。而赋值运算符和条件运算符则具有右结合性,即其运算方向是从右到左进行的。各运算符的优先级见表2-16。

使用括号()可以显式地标明运算次序,括号中的表达式首先被计算。适当地使用括号可以使表达式的运算结构更为清晰。例如对下面的表达式

978-7-111-44824-2-Part01-77.jpg

可以使用括号,表示为

978-7-111-44824-2-Part01-78.jpg

这使运算的次序表达得更为明确,增加了程序语句的可读性。

表2-16 Java运算符的优先级

978-7-111-44824-2-Part01-79.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈