运算符和表达式

运算符和表达式

运算符

​ 就是对常量或者变量进行操作的符号。比如:+ - * /

表达式

​ 用运算符把常量或者变量连接起来的,符合Java语法的式子就是表达式。

比如:a+b这个整体就是表达式,而其中+是算术运算符的一种,所以这个表达式也称之为算术表达式。

算术运算符

分类:

1
+   -   *  /  %

运算特点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
+ - *:跟小学数学中一模一样没有任何区别

/:
1.整数相除结果只能得到整除,如果想要小数,必须要小数参数。
2.小数直接参与运算,得到的结果有可能是不精确的
案例:
System.out.println(10/3);//3
System.out.println(10.0/3);//3.3333333333333335

%:取模、取余
它做的也是除法运算,只不过获取的是余数而已。
案例:
System.out.println(10%2);//0
System.out.println(10%3);//1
应用场景:
//可以里利用取模来判断一个数是奇数还是偶数
System.out.println(15%2);//余数是1是奇数、0则是偶数

练习:数值拆分

需求:键盘录入一个三位数、将其拆分为个位、十位、百位后,打印在控制台

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 公式:首先整数相除获得也是整数。所以
* 个位: 123%10=3
* 十位:123/10=12 12%10=2
* 百位 123/100=1 1%10=1
* 获取任意一个数上每一位数。
*
* 个位:数字 % 10
* 十位:数字 / 10 % 10
* 百位:数字 / 100 % 10
* 千位:数字 / 1000 % 10
* 。。以此类推。。。
*/

public class Demo1{
public static void mian(String[] args){
//1.导包-----创建对象-----接收数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位数");
int number = sc.nextInt();

//2.获取这个三位数上的个位、十位、百位并打印出来
//个位
int ones = number%10;
//十位
int tens =number/10%10;
//百位
int hundreds = number/100 %10;

System.out.println("个位数为:"+ones);
System.out.println("十位数为:"+tens);
System.out.println("百位数为:"+hundreds);
}
}

隐式转换

也叫自动类型提升。就是把一个取值范围小的数据或者变量,赋值给另一个取值范围大的变量。此时不需要我们额外写代码单独实现,是程序自动帮我们完成的。

简单记忆

​ 就是小的给大的,可以直接给。

两种提升规则

  • 取值范围小的,和取值范围大的进行运算,小的会先提升为大的,在进行运算
  • byte、short、char三种类型的数据在运算的时候,都会直接先提升为int,然后在进行运算

取值范围从小到大关系:

graph LR
1[byte]-->2[short]-->3[int]-->4[long]-->5[flaot]-->6[double]

案例

1
2
3
4
5
byte b =10;
short s =20;
long n=100L;
??? result = b+s+n;
//问变量result是什么类型的?

解析:

​ 变量b是byte类型,变量s是short类型的,变量n是long类型的。byte,short,char类型的变量在参与运算的时候,变量里面的值会直接先提升为int。

第一步:变量b和变量s里面的值会先提升为int参与运算。

init+int+long

第二步:而long类型的取值范围是大于int类型的取值范围的。所以变量b和变量s的值会再次提升为long。long+long+long

所以最终结果是long类型的。

强制转换

如果要把一个取值范围大的数据或者变量赋值给另一个取值范围小的变量。是不允许直接操作。如果一定要这么干,就需要加入强制转换。

书写格式:

​ 目标数据类型 变量名=(目标数据类型)被强转的数据

简单理解:

​ 要转成什么类型的,那么就在小括号中些什么类型就可以了。

注意点:

​ 强制转换有可能会导致数据发生错误.。(数据的精度丢失)

字符串的+操作

  • 当+操作中出现字符串时,此时就是字符串的连接符,会将前后的数据进行拼接,并产生一个新的字符串
  • 当连续进行+操作时,从左到右逐个执行的。

案例

1
2
3
1+2+"abc"+2+1

//结果“3abc21”

解析:

  1. 1+2。在这个过程中,没有字符串参与的,所以做的是加法运算,结果为3
  2. 3+”abc”。在这个过程中,有字符串参与的,所以做的是拼接操作,产生一个新的字符串”3abc”
  3. “3abc”+2,在这个过程中,有字符串参与的,所以做的是拼接操作,产生一个新的字符串”3abc2”
  4. “3abc2”+1。在这个过程中,有字符串参与的,所以做的是拼接操作,产生一个新的字符串”3abc21”

字符的+操作

当+操作中出现了字符,会拿着字符到计算机内置的ASCII码表中去查对应的数字,然后在进行计算。

案例:

1
2
3
char c='a';
int result = c+0;
System.out.println(result);//97

算术运算符的总结

注意点:

  • /和%的区别:它们两个都是做除法运算,/取结果的商。%取结果的余数
  • 整数的操作只能得到整数,如果想要得到小数,必须有浮点数参与运算

算术运算符的高级用法:

上述案例以+为例进行记录,其余减法、乘法、除法的运算规则也是一样的

特例:字符串只有+操作,没有其他操作。

自增自减运算符

分类

1
2
++ 自增运算符(就是把变量里面的值+1
-- 自减运算符(就是把变量里面的值-1

使用方式

  • 放在变量的前面,我们叫做先++。比如++a;
  • 放在变量的后面,我们叫做后++。比如a++

不管是先++,还是后++。单独写在一行的时候,运算结果是一模一样的,先++是先加得到值之后在参与之后的逻辑,而后++是,先执行完逻辑后在加

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
int a=10;
int b = a++;//b =10 a=11
int c =++a;//c=12 a=12
System.out.println("a的值:"+a);
System.out.println("b的值:"+b);
System.out.println("c的值:"+c);
}
a的值:12
b的值:10
c的值:12

赋值运算符

​ 最为常用的:=,运算过程:就是把等到右边的结果赋值给左边的变量

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class OperatorDemo6 {
public static void main(String[] args) {
//1.最为简单的赋值运算符用法
int a = 10;//就是把10赋值给变量a
System.out.println(a);

//2.如果等号右边需要进行计算。
int b = 20;
int c = a + b;//先计算等号右边的,把计算的结果赋值给左边的变量
System.out.println(c);

//3.特殊的用法
a = a + 10;//先计算等号右边的,把计算的结果赋值给左边的变量
System.out.println(a);//20
}
}

扩展赋值运算符

分类

​ +=、-=、*=、/=、%=

运算规则

​ 就是左边跟右边进行运算,把最终的结果赋值给左边,对右边没有任何影响

案例

1
2
3
4
5
6
7
8
9
10
public class Test2{
public static void main(String[] args){
//扩展赋值运算符
int a=10;
int b=20;
a+=b;//把左边和右边相加,再把最终的结果赋值给左边,对右边没有任何影响。相当于a=a+b
System.out.println(a);//30
System.out.println(b);//20
}
}

注意点: 扩展的赋值运算符中隐层还包含了一个强制转换

1
2
3
4
5
6
7
8
9
public class OperatorDemo8 {
public static void main(String[] args) {
byte a = 10;
byte b = 20;
//a += b;
a = (byte)(a + b);
System.out.println(a);//30
}
}

关系运算符

​ 又叫比较运算符,其实就是拿着左边跟右边进行了判断而已

分类

符号解释
==就是判断左边跟右边是否相等,如果成立就是true,如果不成立就是false
!=就是判断左边跟右边是否不相等,如果成立就是true,如果不成立就是false
>就是判断左边是否大于右边,如果成立就是true,如果不成立就是false
>=就是判断左边是否大于等于右边,如果成立就是true,如果不成立就是false
<就是判断左边是否小于右边,如果成立就是true,如果不成立就是false
<=就是判断左边是否小于等于右边,如果成立就是true,如果不成立就是false

逻辑运算符

&和|的使用

&:逻辑与(而且)

​ 两边都为真,结果才是真,只要有一个为假,那么结果就是假

|:逻辑或(或者)

​ 两边都为假,结果才是假,只要有一个为真,那么结果就是真。

1
2
3
4
5
6
7
8
9
10
11
12
13
// &  //两边都是真,结果才是真。
System.out.println(true & true);//true
System.out.println(false & false);//false
System.out.println(true & false);//false
System.out.println(false & true);//false

System.out.println("===================================");

// | 或 //两边都是假,结果才是假,如果有一个为真,那么结果就是真。
System.out.println(true | true);//true
System.out.println(false | false);//false
System.out.println(true | false);//true
System.out.println(false | true);//true

^(异或)的使用

​ 计算规则:如果两边相同,结果为false,如果两边不同,结果为true

1
2
3
4
5
//^   //左右不相同,结果才是true,左右相同结果就是false
System.out.println(true ^ true);//false
System.out.println(false ^ false);//false
System.out.println(true ^ false);//true
System.out.println(false ^ true);//true

!(取反)的使用

​ 是·取反,也叫做非

计算规则:false取反就是true。true取反就是false

注意:取反最多只用一个。

短路逻辑运算符

&&

​ 运算结果跟&是一模一样的,只不过具有短路效果

||

​ 运算结果跟|是一模一样的。只不过具有短路效果

逻辑核心

​ 当左边不能确定整个表达式的结果了,右边才会执行。

​ 当左边能确定整个表达式的结果,那么右边就不会执行了。从而提高了代码的运行效率。

三元运算符

又叫做:三元表达式或者问号冒号表达式

格式

关系表达式?表达式1:表达式2;

计算规则

  • 计算关系表达式的值
  • 如果关系表达式的值为真,那么执行表达式1
  • 如果关系表达式的值为假,那么执行表达式2

注意点

​ 三元运算符的最终结果一定要被使用,要么赋值给一个变量,要么直接打印出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class OperatorDemo12 {
public static void main(String[] args) {
//需求:求两个数的较大值
int a = 10;
int b = 20;

//格式:关系表达式 ? 表达式1 : 表达式2 ;
//注意点:
//三元运算符的最终结果一定要被使用。
//要么赋值给一个变量,要么直接输出。
int max = a > b ? a : b ;
System.out.println(max);


System.out.println(a > b ? a : b);
}
}

练习

需求:两只老虎体重分别通过键盘录入获得,请判断两只老虎体重是否相同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Test3 {
public static void main(String[] args) {
/**
* 1.获取键盘录入的老虎体重
* 2.比较老虎的体重是否相同
*/
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一头老虎的体重");
int first = sc.nextInt();
System.out.println("请输入第二头老虎的体重");
int second = sc.nextInt();
String result = first==second?"两只老虎体重相同":"两只老虎体重不相同";
System.out.println(result);
}
}

需求:已知a,b,c身高分别为150cm、210cm、165cm,求出最大值

1
2
3
4
5
6
7
8
9
10
11
12
//1.定义三个变量记录和尚的身高
int height1 = 150;
int height2 = 210;
int height3 = 165;

//2.利用三元运算符求出两个数中的较大值。
int temp = height1 > height2 ? height1 : height2;

//3.求出最终的结果
int max = temp > height3 ? temp : height3;

System.out.println(max);

运算符和表达式
http://example.com/2023/01/29/Java基础/运算符和表达式/operators-expressions/
作者
zhuixun
发布于
2023年1月29日
许可协议