从零开始学Java Web开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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