Java程序设计案例教程
上QQ阅读APP看书,第一时间看更新

2.4 运算符和表达式

Java语言中对数据的处理过程称为运算,用于表示运算的符号称为运算符,它由1至3个字符结合而成。虽然运算符是由数个字符组合而成,但Java将其视为一个符号。参加运算的数据称为操作数,按操作数的个数来划分运算符的类型有:一元运算符(如++)、二元运算符(如*)和三元运算符(如?:)。按功能划分运算符的类型有:算术运算符、关系运算符、布尔运算符、位运算符、赋值运算符、条件运算符和其他运算符。

2.4.1 算术运算符

算术运算符主要完成算术运算。常见的算术运算符如表2-5所示。

2-5 Java中的算术运算符

978-7-111-60245-3-Chapter02-12.jpg

使用算术运算符时需要注意如下几个方面:

进行二元运算时,如果两个操作数的类型不同,将会首先自动进行类型转换。

对两个整数进行除法操作时,所得结果为整数,小数部分将被丢弃。

增量、减量运算符只能用于变量,不能用于常量和表达式。

Java对加运算符“+”进行了扩展,以用于字符串的连接,如"abd"+"de",得到的结果为新串"abcde"。

【例2.2】算术运算符测试示例。

978-7-111-60245-3-Chapter02-13.jpg

978-7-111-60245-3-Chapter02-14.jpg

程序运行结果如图2-2所示。

978-7-111-60245-3-Chapter02-15.jpg

图2-2 算术运算符运算结果

2.4.2 关系运算符

关系运算是比较两个数据之间的大于、小于或等于关系的运算,结果返回逻辑值(true或false)。在一个比较运算符两边的数据类型应该一致。Java中提供6种关系运算符,如表2-6所示。

2-6 Java中的关系运算符

978-7-111-60245-3-Chapter02-16.jpg

整数或浮点数的关系运算是比较两个数的大小,字符型数据的关系运算是比较其Unicode码的大小,boolean值只能进行==或!=两种比较运算。

Java中,任何数据类型的数据(包括基本类型和引用类型)都可以通过==或!=来比较是否相等。关系运算符常与布尔逻辑运算符一起使用,作为流程控制语句的判断条件。

关系运算符的优先级别低于算术运算符,关系运算符的执行顺序自左至右。

【例2.3】关系运算符使用示例。

978-7-111-60245-3-Chapter02-17.jpg

978-7-111-60245-3-Chapter02-18.jpg

978-7-111-60245-3-Chapter02-19.jpg

图2-3 关系运算符运算结果

2.4.3 布尔运算符

布尔逻辑运算符主要完成操作数的布尔逻辑运算,结果为布尔值。Java中的布尔逻辑运算符共有6种,如表2-7所示。

2-7 Java中的布尔逻辑运算符

978-7-111-60245-3-Chapter02-20.jpg

&&和&的运算结果是一样的,只有当两个操作数都为真时,结果为真。两者的区别在于,&&也称为短路与,具有短路运算功能,即若运算符左端的表达式为假时,则整个表达式的值已经确定,运算符右端的表达式将不需要被计算。而&不存在短路运算,在任何情况下都要计算两边的表达式。同理,||和|的运算结果也是一样的,只有当两个操作数都为假时,结果为假,但||具有短路运算功能。&和|虽然不具有短路运算功能,但可以在第2个表达式中增加额外的附加部分功能。当异或运算符^两端表达式的值都为true或都为false时,异或运算的结果为假,而当运算符两端表达式的值一个为true另一个为false时,异或运算的结果为真。

【例2.4】布尔运算符使用示例。

978-7-111-60245-3-Chapter02-21.jpg

978-7-111-60245-3-Chapter02-22.jpg

978-7-111-60245-3-Chapter02-23.jpg

图2-4 布尔运算符运算结果

2.4.4 位运算符

位运算符是对以二进制为单位的操作数的每一位进行操作,但运算的操作数和结果都是整型变量。但运算符共有7种,如表2-8所示。

2-8 Java中的位运算符

978-7-111-60245-3-Chapter02-24.jpg

【例2.5】位运算符使用示例。

public class Example2_5{

public static void main(String[]args){

int a=3;

int b=4;

System.out.println(a|b);

System.out.println(a&b);

System.out.println(a^b);

System.out.println(a<<2);

System.out.println(b>>2);

}

}

2.4.5 赋值运算符

978-7-111-60245-3-Chapter02-25.jpg

图2-5 位运算符运算结果

赋值运算符“=”用来把一个表达式的值赋给一个变量。如果赋值运算符两边的类型不一致,当赋值运算符右侧表达式的数据类型比左侧的数据类型优先级别低时,则打开门进入数据自动被转化为与左侧相同的高级数据类型,然后将值赋给左侧的变量。当右侧数据类型比左侧数据类型优先级高时,则需要进行强制类型转换,否则会发生错误。

Java将算术运算符或位运算符进行组合,形成复合赋值运算符,以简化某些赋值语句。Java中的部分赋值运算符如表2-9所示。

2-9 Java中的赋值运算符

978-7-111-60245-3-Chapter02-26.jpg

2.4.6 条件运算符

条件运算符“?”是三元运算符,它的一般形式为:

表达式1?表达式2:表达式3

其中表达式1的值必须为布尔类型,如果结果为true,则执行表达式2,表达式2的执行结果即为整个表达式的值。如果表达式1的结果为false,则执行表达式3,表达式3的结果作为整个表达式的值。例如:

int max,a=20,b=15;

max=a>b?a:b;

执行的结果为max=20。

2.4.7 运算符优先级

对表达式进行运算时,要按照运算符的优先顺序从高到低进行,同级的运算符则按从左到右的顺序进行。表2-10列出了Java中运算符的优先顺序。

2-10 Java中的运算符优先顺序

978-7-111-60245-3-Chapter02-27.jpg

2.4.8 表达式与语句

1.表达式

表达式是由操作数和运算符按一定的语法形式组成的用来表达某种运算或含义的符号序列。如3.5/2、2*(a+b)等都是有效的表达式。

每个表达式经过运算后都会产生一定确定的值,称为表达式的值。表达式值的数据类型称为表达式的数据类型,一个常量或一个变量是最简单的表达式。表达式可以作为一个整体,也可以看成一个操作数参与到其他运算中,形成复杂的表达式。根据表达式中所使用的运算符和运算结果的不同,可以将表达式分为算术表达式、关系表达式、布尔表达式、条件表达式及字符串表达式等。

2.语句

Java程序由语句组成,每个语句是一个完整的执行单元,以分号结尾。下列4种表达式后面加上分号,就成了语句。

①赋值表达式。

②变量的++和--运算。

③方法调用。

④对象创建表达式。

上述4类语句,称为表达式语句。Java中除了表达式语句,还有声明语句和流程控制语句。部分语句如:

int a; //声明了int类型变量a

a=3+4; //赋值语句

a++; //相当于a=a+1

System.out.println("HelloWorld!"); //方法调用语句

Person p=new Person(); //对象创建语句

其中,流程控制语句用来控制语句的执行顺序,方法调用语句和对象创建语句的用法将在后面详细介绍。

【例2.6】表达式示例。

978-7-111-60245-3-Chapter02-28.jpg

表达式运算结果如图2-6所示。

978-7-111-60245-3-Chapter02-29.jpg

图2-6 表达式运算结果

3.语句块和作用域

语句块由一对{}以及其中的语句组成,语句块中的语句可以有零行(空语句块)到多行,空语句块留待以后再添加相关语句。任何可以使用语句的地方都可以使用语句块,通常语句块出现在流程控制、类的声明、方法的声明以及异常处理等场合。

每个语句块定义了一个作用域,在作用域内定义的变量是局部变量,局部变量只有在对应的语句块内具有可见性。语句块可以嵌套,每创建一个语句块,就创建了一个新的作用域。作用域嵌套时,外层作用域包含内层作用域,即外层作用域定义的变量在内层作用域中可见;反之,内层作用域定义的变量对外层作用域是不可见的。

【例2.7】变量i与局部变量j在不同作用域的可见性示例。

978-7-111-60245-3-Chapter02-30.jpg

在上述程序中,一对{}定义了一个作用域,在这个作用域内定义的int型变量j在{}外不可见。因而当语句j=5之前的注释符号取消时,将会发生错误。