2.4 运算符与表达式
运算符是用来表示和处理运算和操作的符号。Java语言的运算符与C++语言的非常类似,包含赋值运算符、算术运算符、关系运算符、逻辑运算符、位运算符等,这些不同的运算符之间存在着不同的运算优先级定义。
2.4.1 算术运算符
顾名思义,算术运算符是用来进行算术计算的,它可以分为基本运算符、算术复合赋值运算符、递增和递减运算符。算术运算符的运算数必须是基本数字类型的,也可以是char类型数据,但不能是布尔类型的数据。
1.基本算术运算符
Java的基本运算符及其具体含义如表2.8所示。
表2.8 Java基本运算符及含义
算术运算符的示例代码如下:
int i = 12/5; // i=2整数除法舍余数 double d = 12/5; // d=2.0 整数除法舍余数结果为2,被自动转化成2.0 float f=12.0/5; // f=2.4 结果为精确值
2.算术复合赋值运算符
基本算术运算符和赋值运算符组合形成算术复合赋值运算符,其符号和具体含义如表2.9所示。
表2.9 Java算术复合赋值运算符及含义
3.递增和递减运算符
递增和递减运算用来使变量的值自增1或自减1,其符号和具体含义如表2.10所示。
表2.10 Java递增和递减运算符及含义
在使用递增递减运算符时,要注意运算数在运算符左侧和右侧的区别,运算数在左侧时运算数先参与相关计算与赋值,然后运算数再递增递减,而运算数在右侧时运算数将先递增递减,递增递减后的结果参与相关的计算与赋值,当然无论运算数在运算符的哪边,运算数的结果都将递增或递减。
递增和递减运算符的示例代码如下:
int i = 1; int j= i++; //运算结果为i=2,j=1,i在运算符左侧先赋值,后自增 int k = 1; int l= ++k; //值的结果为k=2,l=2,k在运算符右侧先自增,后赋值
2.4.2 关系运算符
关系运算符是用来判断数值之间的关系的,其运算的结果是布尔值,关系运算符常常用在控制语句和各种循环语句中。其符号和具体含义如表2.11所示。
表2.11 Java关系运算符及含义
关系运算符的示例代码如下:
int a=1; int b=2; boolean b1=(a==b); //b1的值为false boolean b2=(a!=b); //b2的值为true boolean b3=(a>b); //b3的值为false boolean b4=(a<b); //b4的值为true boolean b5=(a>=b); //b5的值为false boolean b6=(a<=b); //b6的值为true
2.4.3 逻辑运算符
逻辑运算符是用来专门对布尔类型的值进行逻辑运算的,因此,参与逻辑运算符的运算数只能是布尔型,结果也是布尔类型的。其符号和具体含义如表2.12所示。
表2.12 Java逻辑运算符及含义
2.4.4 赋值运算符
赋值运算符是指为变量指定值的符号,在Java语言中,赋值运算的一般语法格式为:
变量名=表达式;
其中“=”为赋值运算符,表示将右面的数值赋给左边的变量。
由于Java语言是强类型语言,所以赋值时,表达式的值类型与变量的声明类型必须匹配,如果类型不匹配也要能自动转换为对应的类型,否则编译将报语法错误。
赋值运算符的示例代码如下:
byte b=12; //类型匹配,直接赋值 double d=100; //类型不匹配,先自动将100转换成100.0,后赋值 boolean t= -100; //类型不匹配,无法自动转换,语法错误 a+b=100; //不能为运算式a + b赋值,语法错误
2.4.5 位运算符
Java位运算符允许操作一个整数类型数据中的单个“比特”,即二进制位,位运算符会对运算数中对应的位执行布尔代数或位移。
位运算来源于C语言的低级操作,因为要直接操纵硬件,因此需要直接设置硬件寄存器内的二进制位。由于Java语言的设计初衷是嵌入式家电,所以这种操作符仍被保留下来了,当然在现在的编程过程中,需要直接进行位计算的逻辑已经很少见了。位运算符的符号和具体含义如表2.13所示。
表2.13 Java位运算符及含义
2.4.6 条件运算符
Java提供一个唯一的三元运算符,这个运算符就是“? :”条件运算符。其语法格式为:
expression?statement1:statement2
其中,表达式expression的值为一个布尔值,如果该值为true,则执行语句statement1,如果该值为false,则执行语句statement2,而且需要注意的是statement1和statement2语句返回的值必须具有相同的数据类型。
条件运算符的示例代码如下:
int a=1,b=2,sum=0; int result; result=sum==0?a:b; //使用条件运算符设置result的值 System.out.println("result="+result);
在上述代码中因为sum=0,所以条件sum= =0成立,因此result变量的值等于a,最后程序输出结果为“result=1”。
2.4.7 运算符的优先级
通过上述的讲解,读者已经知道在Java中有许多类型的运算符,在编程中经常会在一个运算表达式中涉及到多种运算,会用到多种运算符,各种运算的优先级会影响计算的先后顺序,也会影响到计算结果,Java中运算符优先级定义如表2.14所示,其中优先的级别是从高向低排列的,同一行的表示优先级相同。
表2.14 Java位运算符优先级
其中“()”运算符常被用来显示包含运算式中需要先计算的部分,尽量在运算表达式中多使用该运算符,可以提高表达式的可读性,并能避免由于运算符的级别问题而造成的定义表达式错误。“[]”运算符是用来表示数组下标的,而“.”运算是用来将对象引用和成员名进行连接的。
2.4.8 表达式
表达式是操作数通过运算符连接起来形成的算式。一个表达式可能同时包括多个操作,操作的顺序由各运算符的优先级及括号决定。
一个常量或一个变量是最简单的表达式。表达式的值还可以作为其他操作的操作数,从而形成更复杂的表达式。
下面是一些表达式的示例:
speed 3.1415 num1+num2 a*(b+c)+d x<=(y-z) x&&y||z