2.4运算符
运算符是一些特殊的符号,主要用于数学函数、一些类型的赋值语句和逻辑比较方面。Java中提供了丰富的运算符,如赋值运算符、算术运算符、比较运算符等。本节将向读者介绍这些运算符。
2.4.1 赋值运算符
赋值运算符以符号“=”表示,它是一个二元运算符(对两个操作数作处理),其功能是将右方操作数所含的值赋给左方的操作数。例如:
int a=100;
该表达式是将100赋值给变量a。左方的操作数必须是一个变量,而右边的操作数则可以是任何表达式,包括变量(如a、number)、常量(如123、'book')、有效的表达式(如45*12)。
由于赋值运算符“=”处理时会先取得右方表达式处理后的结果,因此一个表达式中若含有两个以上的“=”运算符,会从最右方的“=”开始处理。
【例1】使用赋值运算符同时为两个变量赋值
在项目中创建类Eval,在主方法中定义变量,使用赋值运算符为变量赋值。
public class Eval{ //创建类public static void main(String[] args){ //主方法int a,b,c; //声明int型变量a、b、ca = 15; //将15赋值给变量ac = b = a + 4; //将a与4的和赋值给变量b,然后再赋值给变量cSystem.out.println("c值为:"+c); //将变量c的值输出System.out.println("b值为:"+b); //将变量b的值输出}
}
运行结果如下:
c值为:19
b值为:19
说明:在Java中可以把赋值运算符连在一起使用。如: x=y=z=5;
在这个语句中,变量x、y、z都得到同样的值5。但在实际开发中建议开发者分开赋值,这样可以让代码的层次更清晰。
2.4.2算术运算符
Java中的算术运算符主要有+(加)、-(减)、*(乘)、/(除)、%(求余),它们都是二元运算符.Java中算术运算符的功能及使用方式如表1所示。
运算符 | 说明 | 实例 | 结果 |
---|---|---|---|
+ | 加 | 12.45f + 15 | 27.45 |
- | 减 | 4.56 - 0.16 | 4.4 |
* | 乘 | 5L * 12.45f | 62.25 |
/ | 除 | 7 / 2 | 3 |
% | 取余数 | 12 % 10 | 2 |
其中,“+”和“-”运算符还可以作为数值的正负符号,如+5、-7。
注意:在进行除法运算时,0不能做除数。例如,对于语句“int a = 5 / 0;”,系统会抛出ArithmeticException异常。
下面通过一个小程序来介绍算术运算符的使用方法。
【例2】使用算术运算符模拟计算器
创建ArithmeticOperator类,让用户输入两个数字,分别用5种运算符对这两个数字进行计算。
import java.util.Scanner;
public class ArithmeticOperator{public static void main(String[] args){Scanner sc = new Scanner(System.in); //创建扫描器,获取控制台输入的值System.out.println("请输入两个数字,用空格隔开(num1 num2):"); //输入提示double num1 = sc.nextDouble(); //记录输入的第一个数字double num2 = sc.nextDouble(); //记录输入的第二个数字System.out.println("num1+num2的和为:"+(num1 + num2)); //计算和System.out.println("num1-num2的差为:"+(num1 - num2)); //计算差System.out.println("num1*num2的积为:"+(num1 * num2); //计算积System.out.println("num1/num2的商为:"+(num1 / num2)); //计算商System.out.println("num1%num2的余数为:"+(num1 % num2)); //计算余数sc.close(); //关闭扫描器}
}
运行结果如下:
请输入两个数字,用空格隔开(num1 num2):
23 15
num1+num2的和为:38.0
num1+num2的差为:8.0
num1+num2的积为:345.0
num1+num2的商为:1.5333333333333334
num1+num2的余数为:8.0
说明:代码中出现的Scanner扫描器类可以让程序获得用户在控制台输入的值。
2.4.3 自增和自减运算符
自增、自减运算符是单目运算符,可以放在操作元之前,也可以放在操作元之后。操作元必须是一个整型或浮点型变量。自增、自减运算符的作用是使变量的值增1或减1。放在操作元前面的自增、自减运算符,会先将变量的值加1(减1),然后再使该变量参与表达式的运算。放在操作元后面的自增、自减运算符,会先使变量参与表达式的运算,然后再将该变量加1(减1)。例如:
++a(--a) //表示在使用变量a之前,先使a的值加(减)1
a++(a--) //表示在使用变量a之后,使a的值加(减)1
粗略地分析,“++a”与“a++”的作用都相当于a=a+1。假设a=4,则:
b=++a; //先将a的值加1,然后赋给b,此时a值为5,b值为5
再看另一个语法,同样假设a=4,则:
b=a++; //先将a的值赋给b,再将a的值变为5,此时a值为5,b值为4
2.4.4比较运算符
比较运算符属于二元运算符,用于程序中的变量之间、变量和自变量之间以及其他类型的信息之间的比较。比较运算符的运算结果是boolean型。当运算符对应的关系成立时,运算结果为true,否则为false。所有比较运算符通常作为判断的依据用在条件语句中。比较运算符共有6个,如表2所示。
运算符 | 作用 | 举例 | 操作数据 | 结果 |
---|---|---|---|---|
> | 比较左方是否大于右方 | 'a'>'b' | 整型、浮点型、字符型 | false |
< | 比较左方是否小于右方 | 156<456 | 整型、浮点型、字符型 | true |
== | 比较左方是否等于右方 | 'c¹=='c' | 基本数据类型、引用型 | true |
>= | 比较左方是否大于等于右方 | 479>=426 | 整型、浮点型、字符型 | true |
<= | 比较左方是否小于等于右方 | 12.45<=45.5 | 整型、浮点型、字符型 | true |
!= | 比较左方是否不等于右方 | 'y'!='t' | 基本数据类型、引用型 | true |
【例3】使用不同的比较运算符判断两个整数的关系
在项目中创建类Compare,在主方法中创建整型变量,使用比较运算符对变量进行比较运算,并将运算后的结果输出。
public class Compare{ //创建类public static void main(String[] args){int number1 = 4; //声明int型变量number1int number2 = 5; //声明int型变量number2//依次将变量number1与变量number2的比较结果输出System.out.println("number1>number2的返回值为:"+(number1 > number2));System.out.println("number1<number2的返回值为:"+(number1 < number2));System.out.println("number1==number2的返回值为:"+(number1 == number2));System.out.println("number1!=number2的返回值为:"+(number1 != number2));System.out.println("number1>=number2的返回值为:"+(number1 >= number2));System.out.println("number1<=number2的返回值为:"+(number1 <= number2));}
}
运行结果如下:
number1>number2的返回值为:falsenumber1<number2返回值为:true
number1==number2返回值为:false
number1!=number2返回值为:true
number1>=number2返回值为:false
number1<=number2返回值为:true
2.4.5逻辑运算符
返回类型为布尔型的表达式,如比较运算符,可以被组合在一起构成一个更复杂的表达式。这是通过逻辑运算符来实现的。逻辑运算符包括&(&&)(逻辑与)、||(逻辑或)、!(逻辑非)。逻辑运算符的操作元必须是boolean型数据。在逻辑运算符中,除了“!”是一元运算符,其他都是二元运算符。表3给出了逻辑运算符的用法和含义。
运算符 | 含义 | 用法 | 结合方向 |
---|---|---|---|
&&、& | 逻辑与 | op1 && op2 | 从左到右 |
|| | 逻辑或 | op || op | 从左到右 |
! | 逻辑非 | ! op | 从右到左 |
结果为boolean型的变量或表达式可以通过逻辑运算符组合为逻辑表达式。用逻辑运算符进行逻辑运算时,结果如表4所示。
表达式1 | 表达式2 | 表达式1 && 表达式2 | 表达式1 || 表达式2 | ! 表达式1 |
---|---|---|---|---|
true | true | true | true | false |
true | false | false | true | false |
false | false | false | false | true |
false | true | false | true | true |
逻辑运算符“&&”与“&”都表示“逻辑与”,那么它们之间的区别在哪里呢?从表4可以看出,当两个表达式都为true时,“逻辑与”的结果才会是true。使用逻辑运算符“&”会判断两个表达式;而逻辑运算符“&&”则是针对boolean类型的类进行判断,当第一个表达式为false时则不去判断第二个表达式,直接输出结果,从而节省计算机判断的次数。通常将这种在逻辑表达式中从左端的表达式可推断出整个表达式的值的情况称为“短路”,而那些始终需要执行逻辑运算符两边的表达式才能推断出整个表达式的值的情况称为“非短路”。“&&”属于“短路”运算符,而“&”属于“非短路”运算符。
【例4】使用不同的比较运算符判断两个整数的关系
在项目中创建类Calculation,在主方法中创建3个整数,分别记录男生人数、女生人数和总人数,使用逻辑运算符来判断“男生人数大于女生人数并且总人数大于30人”和“男生人数大于女生人数或者总人数大于30人”这两种情况是否存在。
public class Calculation {public static void main(String[] args){int boys = 15; //男生人数int girls = 17; //女生人数int totle = boys + girls; //总人数boolean result1 = ((boys > girls) && (totle > 30)); //男生人数多于女生,且总人数大于30boolean result2 = ((boys > girls) || (totle > 30)); //男生人数多于女生,或总人数大于30System.out.println("男生人数大于女生人数并且总人数大于30人:"+result2); //输出结果System.out.println("男生人数大于女生人数或者总人数大于30人:"+result2);}
}
运行结果如下:
男生人数大于女生人数并且总人数大于30人:false男生人数大于女生人数或者总人数大于30人:true
2.4.6位运算符
位运算符除“按位与”和“按位或”运算符外,其他只能用于处理整数的操作数,包括byte、short、char、int和long等数据类型。位运算是完全针对位方面的操作。整型数据在内存中以二进制的形式表示,如int型变量7的二进制表示是00000000000000000000000000000111。
左边最高位是符号位,最高位是0表示正数,若为1则表示负数。负数采用补码表示,如-8的二进制表示为111111111111111111111111111111000。这样就可以对整型数据进行按位运算。
1.“按位与”运算
“按位与”运算的运算符为“&”,为双目运算符。“按位与”运算的运算法则是:如果两个整型数据a、b对应位都是1,则结果位才是1,否则为0。如果两个操作数的精度不同,则结果的精度与精度高的操作数相同。
2.“按位或”运算
“按位或”运算的运算符为“|”,为双目运算符。“按位或”运算的运算规则是:如果两个操作数对应位都是0,则结果位才是0,否则为1。如果两个操作数的精度不同,则结果的精度与精度高的操作数相同。
3.“按位取反”运算
“按位取反”运算也称“按位非”运算,运算符为“~”,为单目运算符。“按位取反”就是将操作数二进制中的1修改为0,0修改为1。
4.“按位异或”运算
“按位异或”运算的运算符是“^”,为双目运算符。“按位异或”运算的运算法则是:当两个操作数的二进制表示相同(同时为0或同时为1)时,结果为0,否则为1。若两个操作数的精度不同,则结果的精度与精度高的操作数相同。
5.移位操作
除了上述运算符,还可以对数据按二进制位进行移位操作。Java中的移位运算符有以下3种:
☑ <<: 左移。
☑ >>: 右移。
☑ >>>: 无符号右移。
左移就是将运算符左边的操作数的二进制数据,按照运算符右边操作数指定的位数向左移动,边移空的部分补0。右移则复杂一些。当使用“>>”符号时,如果最高位是0,右移空的位就填入0;如果最高位是1,右移空的位就填入1。
Java还提供了无符号右移“>>>”,无论最高位是0还是1,左侧被移空的高位都填入0。
技巧:移位可以实现整数除以或乘以2*n的效果。例如,y<<2与y*4的结果相同;y>>1的结果与y/2的结果相同。总之,一个数左移n位,就是将这个数乘以2*n;一个数右移n位,就是将这个数除以2*n。
2.4.7三元运算符
三元运算符的使用格式为:
条件式 ? 值1 : 值2
三元运算符的运算规则为:若条件式的值为true,则整个表达式取值1,否则取值2。例如:
boolean b = 20 < 45 ? true : false;
上述程序表达式“20<45”的运算结果返回真,那么 boolean型变量b取值为true。相反,如果表达式的运算结果返回为假,则boolean型变量b取值为false。
三元运算符等价于if..else语句,例如上述代码等价于:
boolean a; //声明boolean型变量
if(20 < 45) //将20<45作为判断条件
a = true; //条件成立,将true赋值给a
else
a = false; //条件不成立,将false赋值给a
2.4.8 运算符优先级
Java中的表达式就是使用运算符连接起来的符合Java规则的式子。运算符的优先级决定了表达式中运算执行的先后顺序。通常,优先级由高到低的顺序依次是:
☑增量和减量运算。
☑算术运算。
☑ 比较运算。
☑ 逻辑运算。
☑赋值运算。
如果两个运算有相同的优先级,那么左边的表达式要比右边的表达式先被处理。表5显示了在Java中众多运算符特定的优先级。
优先级 | 描述 | 运算符 |
---|---|---|
1 | 圆括号 | () |
2 | 正负号 | +、- |
3 | 一元运算符 | ++、--、! |
4 | 乘除 | *、/、% |
5 | 加减 | +、- |
6 | 移位运算 | >>、>>>、<< |
7 | 比较大小 | <、>、>=、<= |
8 | 比较是否相等 | ==、!= |
9 | 按位与运算 | & |
10 | 按位异或运算 | ^ |
11 | 按位或运算 | | |
12 | 逻辑与运算 | && |
13 | 逻辑或运算 | || |
14 | 三元运算符 | ?: |
15 | 赋值运算符 | = |
技巧:在编写程序时尽量使用圆括号来指定运算次序,以免产生错误的运算顺序。