一、概述
Java 中的运算符用于数字计算,算术运算符包括以下运算符:
操作符 | 输入示例 | 解释 |
---|---|---|
+ | x + y | 添加 x 和 y。 |
- | x-y | 从 x 中减去 y。 |
* | x*y | 将 x 乘以 y。 |
/ | x/y | x 除以 y。 |
% | x % y | 求 x 除以 y 后的余数。 |
++ | ++x, y++ | ++x 在将 x 递增 1 后对其求值。y++ 在评估后递增 y。 |
– | –x, y– | –x 在将 x 减 1 后对其求值。y-- 评估后递减 y。 |
二、使用 ++, – 运算符
+±-将目标操作数分别递增或递减 1,有将运算符放在操作数之前的前缀(++x,–x)和将运算符放在操作数之后的后缀(y++,y–),两者的含义不同。
在前缀情况下,值在递增或递减 1 后进行计算,在后缀情况下,将值递增或递减 1。
下面用代码进行演示:
package com.test.javaroads.operator;
/**
* @author: javaroads
* @date: 2022/12/1 12:18
* @description:
*/
public class One {
public static void main(String[] args) {
int a = 100;
int b = 100;
// 将变量 a 的值增加 1 后,将变量 answerA 赋值
int answerA = ++a;
// 将变量 b 分配给变量 answerB 后,将变量 b 的值增加1
int answerB = b++;
System.out.println(answerA + " : " + a);
System.out.println(answerB + " : " + b);
}
}
执行结果:
我们解释一下以上步骤:
int answerA = ++a
,因为++
在前,所以变量 answerA 的值是在变量 x 的值递增 1 之后赋值的。int answerB = b++
,因为++
在后,所以在将变量 y 的值赋给变量 answerB 之后,我们将变量 y 的值加 1。- 使用 println 方法打印 answerA 和 x 的值,显示11是因为answerA被赋值为自增1后的值。
- 用println方法打印answerB和y值,显示 10 是因为在 answerY 递增 1 之前为其分配了值。
三、算术运算结果的数据类型
在不同数据类型之间进行算术运算时,运算结果的数据类型由进行计算的数据类型之间的关系决定。
在整型和浮点型之间进行计算时,得到的数据类型是浮点型,在数据存储量大的数据类型(long型、double型)和数据存储量小的数据类型(int型、float型)之间进行计算时,结果变量的数据类型为浮点型(long类型、double类型)。
此外,以 char 类型、byte 类型或 short 类型进行计算时,结果数据类型将是 int 类型(运算处理中包括浮点型或 long 类型时除外)。
结果数据类型 | 解释 |
---|---|
long | 所有变量都不包含浮点类型(double、float)。其中一个变量是 long 类型。 |
int | 所有变量都不包含浮点类型(double、float)。没有一个变量包含长类型。 |
double | 其中一个变量包含双精度类型。 |
float | 没有一个变量包含 double 类型。其中一个变量是 float 类型。 |
下面我们用代码演示一下:
package com.test.javaroads.operator;
/**
* @author: javaroads
* @date: 2022/12/1 14:18
* @description:
*/
public class Two {
public static void main(String[] args) {
int x1 = 10;
double y1 = 20.05;
int z1 = x1 + y1;
int x2 = 10;
long y2 = 1000;
int z2 = x2 + y2;
byte x3 = 10;
byte y3 = 10;
byte z3 = x3 + y3;
}
}
以上代码编译肯定是报错的,我们来解释一下:
- int型和double型变量的计算结果赋值给int型变量,包含浮点型的运算结果的数据类型为浮点型,因此会产生编译错误。
- int型和long型变量的计算结果赋值给int型变量,由于不同数据存储容量的数据类型的计算结果的数据类型将是数据存储容量较大的数据类型,因此会出现编译错误。
- 字节型变量和字节型变量的计算结果被分配给字节型变量,由于byte类型和short类型的计算结果的数据类型是int类型,所以会出现编译错误。
所以正确的应该这样写:
int x1 = 10;
double y1 = 20.05;
double z1 = x1 + y1;
int x2 = 10;
long y2 = 1000;
long z2 = x2 + y2;
byte x3 = 10;
byte y3 = 10;
int z3 = x3 + y3;
四、使用 + 运算符作为字符连接
如果 + 运算符的两个目标操作数都是数字,则 + 运算符的行为类似于加法,但如果其中一个目标操作数也是 String 对象,则 + 的行为类似于 String 对象的串联,这种特性在打印的方法中使用最多。
如果要连接的两个操作数都是String对象,没有问题,但如果一个是String对象,另一个不是,那么操作数必须转换为String对象。转换的方法取决于操作数是引用类型还是基类型。引用类型从每个类生成,包括 String 对象和每个程序员创建的任意对象。基本类型是那些具有 char、byte、short、int、long、float、double 和 boolean 数据格式的类型。
如果操作数是引用类型,则使用 toString 方法,toString方法是将数据转换为String对象的方法,在类java.lang.Object的根目录中实现,所以在所有类中都可以使用。如果操作数是基本类型,则使用为每个基本类型提供的包装类(如int类型的Integer类)实现的toString方法将基本类型数据转换为String对象。
代码示例:
package com.test.javaroads.operator;
/**
* @author: javaroads
* @date: 2022/12/1 16:26
* @description:
*/
public class Three {
public static void main(String[] args) {
double number = 23.233;
System.out.println("我是字符串" + "23.233");
System.out.println("我是字符串" + number);
}
}
执行结果:
我们解读一下代码:
- 将 23.233 赋值给双精度型变量 number。
- 两个操作数都是 String 对象,因此 + 运算符连接操作数后结果为字符串。
- 一个操作数是String对象,一个双精度型变量变量,用+连接,最终结果为字符串。