Java运算符
1. 算术运算符
1.1 运算符和表达式
-
运算符*:对常量或者变量进行操作的符号
-
表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。
不同运算符连接的表达式体现的是不同类型的表达式。
举例说明:
1
2
3int a = 10;
int b = 20;
int c = a + b;+:是运算符,并且是算术运算符。
a + b:是表达式,由于+是算术运算符,所以这个表达式叫算术表达式。
1.2 算术运算符
符号 | 作用 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取余 |
注意:
/和%的区别:
-
两个数据做除法,/取结果的商,%取结果的余数。
-
整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。
1
2
3
4int a = 10;
int b = 3;
System.out.println(a / b); // 输出结果3
System.out.println(a % b); // 输出结果1
2. 字符的“+”操作
2.1 操作一
char类型参与算术运算,使用的是计算机底层对应的十进制数值。
需要我们记住三个字符对应的数值:
-
‘a’ – 97 a-z是连续的,所以’b’对应的数值是98,'c’是99,依次递加
-
‘A’ – 65 A-Z是连续的,所以’B’对应的数值是66,'C’是67,依次递加
-
‘0’ – 48 0-9是连续的,所以’1’对应的数值是49,'2’是50,依次递加
1 | // 可以通过使用字符与整数做算术运算,得出字符对应的数值是多少 |
算术表达式中包含不同的基本数据类型的值的时候,整个算术表达式的类型会自动进行提升。
提升规则:
-
byte类型,short类型和char类型将被提升到int类型,不管是否有其他类型参与运算。
-
整个表达式的类型自动提升到与表达式中最高等级的操作数**相同的类型 **
-
等级顺序:byte,short,char --> int --> long --> float --> double
例如:
1
2
3
4
5
6
7
8
9
10byte b1 = 10;
byte b2 = 20;
// byte b3 = b1 + b2; // 该行报错,因为byte类型参与算术运算会自动提示为int,int赋值给byte可能损失
精度
int i3 = b1 + b2; // 应该使用int接收
byte b3 = (byte) (b1 + b2); // 或者将结果强制转换为byte类型
-------------------------------
int num1 = 10;
double num2 = 20.0;
double num3 = num1 + num2; // 使用double接收,因为num1会自动提升为double类型tips:
正是由于上述原因,所以在程序开发中我们很少使用byte或者short类型定义整数。也很少会使用char类型定义字符,而使用字符串类型,更不会使用char类型做算术运算。
2.2 操作二
-
当“+”操作中出现字符串时,这个”+”是字符串连接符,而不是算术运算。
1
System.out.println("太阳雨"+ 666); // 输出:太阳雨666
-
在”+”操作中,如果出现了字符串,就是连接运算符,否则就是算术运算。
-
当连续进行“+”操作时,从左到右逐个执行。
1
2
3
4System.out.println(1 + 99 + "太阳雨"); // 输出:199太阳雨
System.out.println(1 + 2 + "太阳雨" + 3 + 4); // 输出:3太阳雨34
// 可以使用小括号改变运算的优先级
System.out.println(1 + 2 + "太阳雨" + (3 + 4)); // 输出:3太阳雨7
3. 赋值运算符
赋值运算符的作用是将一个表达式的值赋给左边,左边必须是可修改的,不能是常量。
符号 | 作用 | 说明 |
---|---|---|
= | 赋值 | a=10,将10赋值给变量a |
+= | 加后赋值 | a+=b,将a+b的和给a |
-= | 减后赋值 | a-=b,将a-b的差给a |
*= | 乘侯赋值 | a*=b,将axb的值给a |
/= | 除后赋值 | a/=b,将a/b的商给a |
%= | 取余后赋值 | a%=b,将a%b的余数给a |
注意: 扩展的赋值运算符隐含了强制类型转换。
1 | short s = 10; |
4. 自增自减运算符
符号 | 作用 | 说明 |
---|---|---|
++ | 自增 | 变量的值加1 |
– | 自减 | 变量的值减1 |
注意事项:
++和-- 既可以放在变量的后边,也可以放在变量的前边。
单独使用的时候, ++和-- 无论是放在变量的前边还是后边,结果是一样的。
参与操作的时候,如果放在变量的后边,先拿变量参与操作,后拿变量做++或者–。
参与操作的时候,如果放在变量的前边,先拿变量做++或者–,后拿变量参与操作。
最常见的用法:单独使用。
1 | int i = 10; |
练习
1 | int x = 10; |
5. 关系运算符
关系运算符有6种关系,分别为小于、小于等于、大于、等于、大于等于、不等于。
符号 | 说明 |
---|---|
== | a==b,判断a和b的值是否相等,成立为true,不成立为false |
!= | a!=b,判断a和b的值是否不相等,成立为true,不成立为false |
> | a>b,判断a是否大于b,成立为true,不成立为false |
>= | a>=b,判断a是否大于等于b,成立为true,不成立为false |
< | a<b,判断a是否小于b,成立为true,不成立为false |
<= | a<=b,判断a是否小于等于b,成立为true,不成立为false |
注意事项: 关系运算符的结果都是boolean类型,要么是true,要么是false。
千万不要把“= =”误写成“=”,"==“是判断是否相等的关系,”="是赋值。
1 | int a = 10; |
6. 逻辑运算符
6.1 逻辑
逻辑运算符把各个运算的关系表达式连接起来组成一个复杂的逻辑表达式,以判断程序中的表达式是否成立,
判断的结果是 true 或 false。
符号 | 作用 | 说明 |
---|---|---|
& | 逻辑与 | a&b,a和b都是true,结果为true,否则为false(一假必假) |
| | 逻辑或 | a|b,a和b都是false,结果为false,否则为true(一真必真) |
! | 逻辑非 | !a,结果和a的结果正好相反 |
^ | 逻辑异或 | a^b,a和b结果不同为true,相同为false |
1 | //定义变量 |
6.2 短路逻辑
符号 | 作用 | 说明 |
---|---|---|
&& | 短路与 | 作用和&相同,但是有短路效果 |
|| | 短路或 | 作用和|相同,但是有短路效果 |
在逻辑与运算中,只要有一个表达式的值为false,那么结果就可以判定为false了,没有必要将所有表达式的值都 计算出来,短路与操作就有这样的效果,可以提高效率。同理在逻辑或运算中,一旦发现值为true,右边的表达式 将不再参与运算。
-
逻辑与&,无论左边真假,右边都要执行。
-
短路与&&,如果左边为真,右边执行;如果左边为假,右边不执行。
-
逻辑或|,无论左边真假,右边都要执行。
-
短路或||,如果左边为假,右边执行;如果左边为真,右边不执行。
1
2
3
4
5
6
7
8
9int x = 3;
int y = 4;
System.out.println((x++ > 4) & (y++ > 5)); // 两个表达都会运算
System.out.println(x); // 4
System.out.println(y); // 5
System.out.println((x++ > 4) && (y++ > 5)); // 左边已经可以确定结果为false,右边不参与运算
System.out.println(x); // 4
System.out.println(y); // 4
7. 三目运算符
-
语法格式:
1
2关系表达式 ? 表达式1 : 表达式2;
a>b?a:b;解释:
问号前面的位置是判断的条件,判断结果为boolean型,
为true时调用表达式1,为false时调用表达式2。
其逻辑为:如果条件表达式成立或者满足则执行表达式1,否则执行第二个。
举例:
1
2
3
4
5
6
7
8
9package Demo;
public class Demo{
public static void main(String[] args){
int a = 10;
int b = 20;
int c = a > b ? a : b; // 判断 a>b 是否为真,如果为真取a的值,如果为假,取b的值
System.out.println(c); //20
}
}案例:
需求:一座寺庙里住着三个和尚,已知他们的身高分别为150cm、210cm、165cm,请用程序实现获取这三个 和尚的最高身高
1
2
3
4
5
6
7
8
9
10
11
12
13
14public class Demo {
public static void main(String[] args) {
//1:定义三个变量用于保存和尚的身高,单位为cm,这里仅仅体现数值即可。
int height1 = 150;
int height2 = 210;
int height3 = 165;
//2:用三元运算符获取前两个和尚的较高身高值,并用临时身高变量保存起来。
int tempHeight = height1 > height2 ? height1 : height2;
//3:用三元运算符获取临时身高值和第三个和尚身高较高值,并用最大身高变量保存。
int maxHeight = tempHeight > height3 ? tempHeight : height3;
//4:输出结果
System.out.println("maxHeight:" + maxHeight);
}
}
8. 数据输入
我们可以通过 Scanner 类来获取用户的输入。
使用步骤如下:
-
导包。Scanner 类在java.util包下,所以需要将该类导入。导包的语句需要定义在类的上面。
1
import java.util.Scanner;
-
创建Scanner对象。
1
Scanner sc = new Scanner(System.in);// 创建Scanner对象,sc表示变量名,其他均不可变
-
接收数据
1
int i = sc.nextInt(); // 表示将键盘录入的值作为int数返回。
-
打印数据
1
System.out.println(i);
例子:
1
2
3
4
5
6
7
8
9package Demo;
import java.util.Scanner;
public class Demo{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
System.out.println(i);
}
}