2.6 运算符
运算符是一些特殊的符号,用于算数计算、逻辑运算、赋值和比较等。下面来详细介绍运算符的使用。
2.6.1 赋值运算符
赋值运算符,顾名思义就是用来赋值的。符号为=,它是二元运算符,有两个操作数参与运算。将右边操作数的值赋给左边的操作数。例如:
int a=2;
左边的操作数必须是一个初始化过的变量或常量,右边的操作数则可以是变量(例如a、number)、常量(例如123、'abc'),或者有效的表达式(如45+20)。
在Java中,除了基本的赋值运算符(=)外,还有一些复合赋值运算符。复合赋值运算符是在基本的赋值运算符的基础上,结合算术运算符而形成的具有特殊意义的运算符。赋值运算符的含义及其应用示例如表2-6所示。
表2-6 赋值运算符的含义及其应用示例
【例2.10】使用赋值运算符给变量赋值(源代码\ch02\2.10.txt)。
运行结果如图2-16所示。
图2-16 赋值运算符运算结果
Java中可实现多个赋值运算符之间的连接赋值,例如:
int x,y,z; x=y=z=1;
这个语句中,变量x、y、z都得到同样的值1,但在实际开发过程中不建议使用这种赋值语法。
2.6.2 算术运算符
算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。算术运算符的含义及其应用示例如表2-7所示。表2-7中的示例假设整数变量A的值为10,整数变量B的值为20。
表2-7 算术运算符的含义及其应用示例
算术运算符操作规则如下:
(1)两个操作数可以是常量、变量或有效表达式,但必须是初始化过的。
(2)当进行除法运算时,右侧操作数的值不能是0,0不能做除数。
(3)多个算术运算符可以连用,但有优先级,其优先级等同于四则运算优先级。
【例2.11】简单的计算小神器,模拟计算器功能。创建SmallCalculator类,让用户输入两个数字,分别用5种运算符对这两个数字进行计算(源代码\ch02\2.11.txt)。
图2-17 算术运算符运算结果
运行结果如图2-17所示。
☆大牛提醒☆
“+”运算符可以实现字符串的拼接。
2.6.3 自增和自减运算符
自增和自减运算符是单目运算符,可以放在变量之前,也可以放在变量之后,因符号位置的不同,其运算结果也会不同。自增和自减运算符的作用是使变量的值加1或减1,语法格式如下:
【例2.12】自增运算符++a应用示例(源代码\ch02\2.12.txt)。
运行结果如图2-18所示。通过结果我们看到,++a是a先+1,然后把结果赋值给b。
【例2.13】自增运算符a++应用示例(源代码\ch02\2.13.txt)。
运行结果如图2-19所示。通过结果我们看到,a++是先将a赋值给b,然后a再+1。
图2-18 自增运算符++a
图2-19 自增运算符a++
总之,a++或者++a,对a来说最后的结果都是自加1,但对b来说,结果就不一样了。通过这两个例子,希望读者能够明白a++和++a的区别,并以此类推a--和--a等。
2.6.4 关系运算符
关系运算符也被称为比较运算符,是指对两个操作数进行关系运算的运算符,主要用于确定两个操作数之间的关系,关系运算符的计算结果都是布尔型数据,如表2-8所示。
表2-8 关系运算符
【例2.14】输入两个数值,使用关系运算符来计算这两个数值之间的关系(源代码\ch02\ 2.14.txt)。
运行结果如图2-20所示。
图2-20 关系运算符运算结果
2.6.5 逻辑运算符
逻辑运算符是对真和假这两种逻辑值进行运算,运算后的结果仍是一个逻辑值。逻辑运算符包括&&(逻辑与)、||(逻辑或)和!(逻辑非)。逻辑运算符的计算结果必须是布尔型数据。在逻辑运算符中,除了“!”是一元运算符之外,其他都是二元运算符,如表2-9所示是逻辑运算符。
表2-9 逻辑运算符
如表2-10所示是逻辑运算符的运算结果。
表2-10 逻辑运算符的运算结果
关系运算符的结果是布尔值,当关系运算符与逻辑运算符结合使用,可以完成更为复杂的逻辑运算,从而解决生活中的问题。
例如,游乐场中有些游戏设施是有游玩要求的。旋转木马要求身高不到1米的小孩需大人陪同。那么身高和大人陪同两个条件的满足与否,决定是否能玩该游戏项目,这就是一个逻辑关系运算。
【例2.15】利用逻辑运算符与关系运算符进行运算,判断一个小孩是否可以玩旋转木马(源代码\ch02\2.15.txt)。
这里给旋转木马游玩的两个要求设变量,设身高大于1米为A,有大人陪同为B。根据要求有,当A为真,那么无论B取什么值都能玩;而当A为假,则只有当B为真才可以玩,由此可见,该问题是逻辑或运算。下面就根据输入的身高A和是否大人陪同B来输出能否玩(即A||B)的逻辑结果。
运行结果如图2-21所示,这里分为如下4种情况。
图2-21 逻辑运算符运算结果
图2-21 逻辑运算符运算结果(续)
2.6.6 位运算符
位运算符的操作数类型是整型,可以是有符号的也可以是无符号的。位运算符分为两类:位逻辑运算符和位移运算符,如表2-11所示。
表2-11 位运算符的含义及其应用示例
1.位逻辑运算符
位逻辑运算符&、|、^和~,其中&、|、^是双目运算符,~是单目运算符。这4个运算符的运算结果如表2-12所示。
表2-12 位逻辑运算符计算二进制的结果
&、|和^运算符还可以用于逻辑运算,运算结果如表2-13所示。
表2-13 位逻辑运算符计算布尔值的结果
【例2.16】使用位逻辑运算符进行运算(源代码\ch02\2.16.txt)。
运行结果如图2-22所示。
2.位移运算符
位移运算符有3个,分别为左移“<<”、右移“>>”和无符号右移“>>>”,这三个运算符都可以将任意数字以二进制的方式进行位数移动运算。其中左移“<<”和右移“>>”不会改变数字的正负,但是经过无符号右移后,只能产生正数结果。
【例2.17】使用位移运算符进行运算(源代码\ch02\2.17.txt)。
运行结果如图2-23所示。
图2-22 位逻辑运算符运算结果
图2-23 位移运算符运算结果
2.6.7 复合赋值运算符
复合赋值运算符是在基本的赋值运算符基础上,结合其他运算符而形成的具有特殊意义的运算符。Java中复合赋值运算符如表2-14所示。
表2-14 复合赋值运算符
复合赋值运算符与其他运算符相比,在不同的场景中,具有各自的优势与劣势。例如:“a+=1”与“a=a+1”两者的最后计算结果是相同的,但是在如下代码运行时,就会出现错误:
这是因为在没有进行强制类型转换的条件下,a+1的结果是一个int值(Java默认数据类型),这就无法直接赋给byte变量,但是如果使用+=复合赋值运算符,就会避免出现这个问题。例如:
☆大牛提醒☆
复合赋值运算符中两个符号之间没有空格,例如以下代码:
【例2.18】复合赋值运算符的应用示例(源代码\ch02\2.18.txt)。
运行结果如图2-24所示。
图2-24 复合赋值运算符的应用
2.6.8 三元运算符
三元运算符是对条件真假不同的结果取不同的值。使用格式如下:
条件表达式?值1:值2
三元运算符的运算规则为:若条件式的值为true,则整个表达式的取值为“值1”,否则取值为“值2”。例如:
如上所示,取值1和取值2可以是相同类型的任意类型值,但表达式必须是一个有效返回真假的表达式。
三元运算符的作用等价于if…else语句。例如将如下语句:
修改为if…else语句,代码如下:
上述代码b的取值为false。
2.6.9 圆括号
圆括号大家都很熟悉,在数学运算中是一个神器,把最先计算的内容括起来则可以跨越四则运算当中的乘除成为第一优先级。Java中有很多运算符号与运算表达式,用户可以通过圆括号来实现更为复杂和更为灵活的表达式运算。
圆括号在算术运算符运算当中的优先运算如下:
int a=20, b=30, c=25,d1,d2; d1 = a+b-c*2+b/10;
这里要想实现从左到右的顺序计算,这个表达式是不可能实现的,这就需要添加圆括号了,代码如下:
d2 = ((a+b-c)*2+b)/10 ;
这样就实现了从左到右的顺序计算,运算结果为d1取值为3,d2取值为8。
☆大牛提醒☆
圆括号必须是成对出现,一定是英文输入法当中的圆括号。
2.6.10 运算符优先级
当多个运算符出现在一个表达式中,谁先谁后呢?这就涉及运算符优先级的问题。在一个多运算符的表达式中,运算符优先级不同会导致最后得出的结果差别甚大。
例如,(1+3)+(3+2)×2,这个表达式如果按加号最优先计算,答案就是18,如果按照乘号最优先,答案则是14。再如,x=7+3×2,这里x得到13,而不是20,因为乘法运算符比加法运算符有较高的优先级,所以先计算3×2得到6,然后再加7。
如表2-15所示的是Java中运算符的优先级排序。
表2-15 运算符的优先级
☆大牛提醒☆
运算符优先级一般遵循表2-5,在编写程序时尽量使用圆括号“()”运算符来限定运算次序,以免运算次序发生错误。