前言
本文主要介绍java语言中的运算符。
1、运算符
运算符:一种特殊的符号,用以表示数据的运算、赋值和比较等。Java语言使用运算符将一个或多个操作数连缀成执行性语句,用以实现特定功能
java语言中运算符的种类:
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 类型相关运算符
1.1 算数运算符
Java支持所有的基本算术运算符,这些算术运算符用于执行基本的数学运算:加、减、乘、除和求余等。
+除可以作为数学的加法运算符之外,还可以作为字符串的连接运算符。-除可以作为减法运算符之外,还可以作为求负的运算符。
@Test
public void operatorTest() {
//"+"和"-"的特殊用途
var num=23;
num=-num;
System.out.println("num:"+num);//结果为num:23
}
/:除法运算符
- (1)被除数和除数都是整型:
除数不为0,结果取整
除数为0,结果抛出异常:ArithmeticException - (2)被除数和除数至少有一个是浮点型:
除数不为0:
①被除数不为0,结果:取精确值
②被除数为0,结果:0.0
除数为0:
①被除数不为0,结果:Infinity或-Infinity
②被除数为0,结果:NaN
@Test
public void operatorTest() {
var a = 6.3;
var b = 2.2;
var result = a / b;
System.out.println("result的值:"+result);
// 输出正无穷大:Infinity
System.out.println("5除以0.0的结果是:" + 5 / 0.0);
// 输出负无穷大:-Infinity
System.out.println("-5除以0.0的结果是:" + - 5 / 0.0);
// 下面代码将出现异常
// java.lang.ArithmeticException: / by zero
System.out.println("-5除以0的结果是::" + -5 / 0);
}
%:取余运算符
计算结果是使用第一个操作数除以第二个操作数,得到一个整除的结果后剩下的值就是余数。(a%b 相当于 a-(a/b)*b)
- (1)被除数和除数都是整型
①除数不为0,结果取整形余数。
②除数为0,结果抛出异常: ArithmeticException - (2)被除数和除数至少有一个是浮点型:
①除数不为0或0.0,结果:取浮点型余数
②除数为0或0.0,结果:NaN - (3)结果的符号与被除数一致
@Test
public void operatorTest() {
var a = 5.2;
var b = 3.1;
var mod = a % b;
System.out.println(mod); // mod的值为2.1
System.out.println("5对0.0求余的结果是:" + 5 % 0.0); // 输出非数:NaN
System.out.println("-5.0对0求余的结果是:" + -5.0 % 0); // 输出非数:NaN
System.out.println("0对5.0求余的结果是:" + 0 % 5.0); // 输出0.0
System.out.println("0对0.0求余的结果是:" + 0 % 0.0); // 输出非数:NaN
// 下面代码将出现异常:java.lang.ArithmeticException: / by zero
System.out.println("-5对0求余的结果是:" + -5 % 0);
}
++:自加(将操作数的值加1)、–:自减(将操作数的值减1)
- ① 单目运算符,只能操作一个操作数;
- ② 单目运算符只能操作单个数值型(整型、浮点型都行)的变量,不能操作常量或表达式
- ③ 运算符出现在操作数的左边,先把操作数加或减1,然后才把操作数放入表达式中运算;把运算符出现在操作数的右边,则先把操作数放入表达式中运算,然后才把操作数加或减1。
- ④ 自增和自减不会改变基本数据类型变量本身的数据类型
解释请见:酒浅未眠的博客:Java 趣事之 a=a++ 和 a=++a
1.2 赋值运算符
Java使用=作为赋值运算符,通常使用赋值运算符将一个直接量值赋给变量。
说明
- ①当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制
类型转换原则进行处理。 - ②支持连续赋值。
@Test
public void operatorTest() {
var str = "Java"; // 为变量str赋值为Java
var str2 = str; // 将变量str的值赋给str2
int a;
int b;
int c;
// 通过为a, b, c赋值,三个变量的值都是7
a = b = c = 7;
// 输出三个变量的值。
System.out.println(a + "\n" + b + "\n" + c);
var d1 = 12.34;
var d2 = d1 + 5; // 将表达式的值赋给d2
System.out.println(d2); // 输出d2的值,将输出17.34
}
1.3 位运算符
位运算:直接对整数的二进制进行运算。
Java支持的位运算符:
- ➢ &:按位与。当两位同时为1时才返回1。
- ➢ |:按位或。只要有一位为1即可返回1。
- ➢ ~:按位非。单目运算符,将操作数的每个位(包括符号位)全部取反。
- ➢ ^:按位异或。当两位相同时返回0,不同时返回1。
- ➢ <<:左移运算符。
- ➢ >>:右移运算符。
- ➢ >>>:无符号右移运算符。
说明:
进行移位运算时还要遵循如下规则:
- ➢ 对于低于int类型(如byte、short和char)的操作数总是先自动类型转换为int类型后再移位。
- ➢ 对于int类型的整数移位a>>b,当b>32时,系统先用b对32求余(因为int类型只有32位),得到的结果才是真正移位的位数。例如,a>>33和a>>1的结果完全一样,而a>>32的结果和a相同。
- ➢ 对于long类型的整数移位a>>b,当b>64时,总是先用b对64求余(因为long类型是64位),得到的结果才是真正移位的位数。
^运算特点:一个数据对另一个数据按位异或两次,该数本身不变,不受位置影响。输出结果为该数的原值。
1.4 扩展后的赋值运算符
赋值运算符可与算术运算符、位移运算符结合,扩展成功能更加强大的运算符。
扩展后的赋值运算符:
- ➢ +=:对于x+=y,相当于 x=x+y。
- ➢ -=:对于x-=y,相当于 x=x-y。
-➢ =:对于x=y,相当于 x=x*y。 - ➢ /=:对于x/=y,相当于 x=x/y。
- ➢ %=:对于x%=y,相当于 x=x%y。
- ➢ &=:对于x&=y,相当于 x=x&y。
- ➢ |=:对于x|=y,相当于 x=x|y。
- ➢ ^=:对于 x^ = y,相当于 x=x^y。
- ➢ <<=:对于x<<=y,相当于 x=x<<y。
- ➢ >>=:对于x>>=y,相当于 x=x>>y。
- ➢ >>>=:对于x>>>=y,相当于 x=x>>>y。
注意:+=, -=, *=, /=, %=不会改变变量本身的数据类型
1.5 比较运算符
比较运算符的结果都是boolean型,也就是要么是true,要么是false。
注意:
基本类型的变量、值不能和引用类型的变量、值使用 == 进行比较;boolean类型的变量、值不能与其他任意类型的变量、值使用 == 进行比较;如果两个引用类型之间没有父子继承关系,那么它们的变量也不能使用==进行比较。
1.6 逻辑运算符
逻辑运算符用于操作两个布尔型的变量或常量。
- ➢ &&:与,前后两个操作数必须都是true才返回true,否则返回false。
- ➢ &:不短路与,作用与&&相同,但不会短路。
- ➢ ||:或,只要两个操作数中有一个是true,就可以返回true,否则返回false。
- ➢ |:不短路或,作用与||相同,但不会短路。
- ➢ !:非,只需要一个操作数,如果操作数为true,则返回false;如果操作数为false,则返回true。
- ➢ ^:异或,当两个操作数不同时才返回true,如果两个操作数相同则返回false。
说明: - “&”和“&&”的区别:
①单&时,左边无论真假,右边都进行运算;
②双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。 - “|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。
- 异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。 异或,追求的是“异”!
@Test
public void operatorTest() {
// 定义变量a,b,并为两个变量赋值
var a = 5;
var b = 10;
// 对a > 4和b++ > 10求或运算
if (a > 4 | b++ > 10) {
// 输出a的值是5,b的值是11。
System.out.println("a的值是:" + a + ",b的值是:" + b);
}
// 定义变量c,d,并为两个变量赋值
var c = 5;
var d = 10;
// c > 4 || d++ > 10求或运算
if (c > 4 || d++ > 10) {
// 输出c的值是5,d的值是10。
System.out.println("c的值是:" + c + ",d的值是:" + d);
}
}
1.7 三目运算符
三目运算符只有一个 :?: 。
三目运算符的语法格式:
说明:
- 三元运算符支持嵌套。不能直接在语法中打印;
- 凡是使用三元运算符的地方,都可以改写成if-else,反之,不成立;
- 如果程序既可以使用三元运算符,又可以使用if-else结构,那么优先选择三元运算符,原因:简洁、执行效率高。
@Test
public void operatorTest() {
var a = 11;
var b = 12;
// 三目运算符支持嵌套
//a小于b
System.out.println(a > b ? "a大于b" : (a < b ? "a小于b" : "a等于b"));
}
1.8 运算符的优先级
Java语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。
上一行中的运算符总是优先于下一行的