3.7 运算符 3.7.1 算术运算符

3.7 运算符

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。Java语言使用运算符将一个或多个操作数连缀成执行性语句,用以实现特定功能

java运算符分类

Java语言中的运算符可分为如下几种。

  • 算术运算符
  • 赋值运算符
  • 比较运算符
  • 逻辑运算符
  • 位运算符
  • 类型相关运算符

3.7.1 算术运算符

Java支持所有的基本算术运算符,这些算术运算符用于执行基本的数学运算:加、减、乘、除和求余等。下面是7个基本的算术运算符。

加法运算符

加法运算符为:+。例如如下代码:

1
2
3
4
5
double a = 5.2;
double b = 3.1;
double sum = a + b;
//sum的值为8.3
System.out.println(sum);

除此之外,+还可以作为字符串的连接运算符。

减法运算符

减法运算符为:-。例如如下代码:

1
2
3
4
5
double a = 5.2;
double b = 3.1;
double sub = a-b;
//sub的值为2.1
System.out.println(sub);

乘法运算符

乘法运算符为:*。例如如下代码:

1
2
3
4
5
double a = 5.2;
double b = 3.1;
double multiply = a* b;
//multiply的值为16.12
System.out.println(multiply);

除法运算符

除法运算符为:/被除数/除数

整数除法

除法运算符有些特殊,如果除法运算符的两个操作数都是整数类型,则计算结果也是整数,就是将自然除法结果的小数部分丢弃,例如19/4的结果是4,而不是5。

整数除法除数不能为零

如果除法运算符的两个操作数都是整数类型,则除数不可以是0,否则将引发除以零异常

浮点数除法

但如果除法运算符的两个操作数有一个是浮点数,或者两个都是浮点数,则计算结果也是浮点数,这个结果就是自然除法的结果。

浮点数除法的除数可以为零 结果为无穷大

浮点数除法允许除数是0,或者0.0,如果除数是0或者0.0,则得到结果是正无穷大或负无穷大。看下面代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class DivTest {
public static void main(String[] args) {
double a = 5.2;
double b = 3.1;
double div = a / b;
// div的值将是1.6774193548387097
System.out.println(div);
// 输出正无穷大: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);
}
}

运行结果:

1
2
3
4
5
1.6774193548387097
5除以0.0的结果是:Infinity
-5除以0.0的结果是:-Infinity
Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivTest.main(DivTest.java:14)

求余运算

求余运算符为:%。求余运算的结果不一定总是整数,它的计算结果是使用第一个操作数除以第二个操作数,得到一个整除的结果后剩下的值就是余数。

整数求余运算第二个操作数不能为零

由于求余运算也需要进行除法运算,因此如果求余运算的两个操作数都是整数类型,则求余运算的第二个操作数不能是0,否则将引发除以零异常。

浮点数求余运算第二个操作数为零得到非数

如果求余运算的两个操作数中有一个或者两个都是浮点数,则允许第二个操作数是0或0.0。**如果求余运算第二个操作数为零,求余运算的结果是非数:NaN**。

浮点数求余运算第一个操作数为零得到零

0或0.0对零以外的任何数求余都将得到0或0.0。

程序示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ModTest {
public static void main(String[] args) {
double a = 5.2;
double b = 3.1;
double mod = a % b;

System.out.println("5.2 对3.1 求余的结果是:" + 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. 自加是单目运算符,只能操作一个操作数;
  2. 自加运算符只能操作单个数值型(整型、浮点型都行)的变量,不能操作常量或表达式。

运算符既可以出现在操作数的左边,也可以出现在操作数的右边。但出现在左边和右边的效果是不一样的。

左加加 先加一再取值

如果把++放在左边,则先把操作数加1,然后才把操作数放入表达式中运算;

右加加 先取值再加一

如果把++放在右边,则先把操作数放入表达式中运算,然后才把操作数加1。

程序示例 右加加

看如下代码:

1
2
3
4
5
int a= 5;
// 让a先执行算术运算,然后自加
int b= a++ +6;
//输出a的值为6,b的值为11
System.out.println(a + "\n"+ b);

执行完后,a的值为6,而b的值为11。
当++在操作数右边时,先执行a+6的运算(此时a的值为5),然后对a加1。

程序示例 左加加

对比下面代码

1
2
3
4
5
int a = 5;
//让a先自加,然后执行算术运算
int b = ++a +6;
//输出a的值为6,b的值为12
System.out.println(a +"\n"+ b);

执行的结果是a的值为6,b的值为12。当++在操作数左边时,先对a加1,然后执行a+6的运算(此时a的值为6),因此b为12。

自减运算符

自减运算符为:--。也是单目运算符,用法与++基本相似,只是将操作数的值减1

更加复杂的运算

Java并没有提供其他更复杂的运算符,如果需要完成乘方、开方等运算,则可借助于java.lang.Math类,Math类下包含了丰富的静态方法,用于完成各种复杂的数学运算

程序示例 乘方 开方 三角

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MathTest {
public static void main(String[] args) {
double a = 3.2; // 定义变量a为3.2
// 求a的5次方,并将计算结果赋为b。
double b = Math.pow(a, 5);
System.out.println(a + "^" + "5=" + b); // 输出b的值。
// 求a的平方根,并将结果赋给c
double c = Math.sqrt(a);
System.out.println(c); // 输出c的值。
// 计算随机数,返回一个0~1之间的伪随机数。
double d = Math.random();
System.out.println(d); // 输出随机数d的值
// 求1.57的sin函数值:1.57被当成弧度数
double e = Math.sin(1.57);
System.out.println(e); // 输出接近1
}
}

负数运算符

+除可以作为数学的加法运算符之外,还可以作为字符串的连接运算符。

-除可以作为减法运算符之外,还可以作为求负的运算符

1
2
3
//定义 double变量x,其值为-5.0
double x=-5.0;
x=-x;//将x求负,其值变成5.0