Java入门 Day003

运算符

  1. 算术运算符
  2. 赋值运算符
  3. 比较运算符
  4. 逻辑运算符
  5. 位运算符
  6. 三目运算符

1、算术运算符

基本算术运算符:
			+,-,*,/,%
扩展的算术运算符:
			++,--			
/:两个数相除,默认取整
%:两个数进行取模,求余数!

Demo:

class OperatorDemo{
	public static void main(String[] args){
		
		//定义两个变量
		int a = 3 ;
		int b = 4 ;
		
		//分别输出
		System.out.println(a+b);
		System.out.println(a-b);
		System.out.println(a*b);
		//System.out.println(a/b);
		System.out.println(a*1.0/b);
		System.out.println("---------------");
		System.out.println(a%b);
	}
}

结果
在这里插入图片描述

扩展的算术运算符:
++,–
1、单独使用:
无论是++,–在数据前还是后,都是对当前数据本身进行自增1或者自减1!
2、参与运算使用:
++,–在数据之后,先进行运算,在进行自增1或者自减1
++,–在数据的前面,先进行自增1或者自减1,在参与运算

        int m = 3 ;
		int n = 4 ;
		//++和--参与运算在数据之后
		//int x = m++ ;	//x=3	//m=3   --->m+1=4
		//int y = n-- ;   //y=4		n =4 --->n-1=3
		
		//++和--参与运算在数据的前面
		int x = ++ m;	//     m=3---->m+1=4---->赋值给x
		int y = -- n;//同理
		
		//分别输出
		System.out.println("m:"+m);//4
		System.out.println("n:"+n);//3
		System.out.println("x:"+x);//3
		System.out.println("y:"+y);//4
		

扩展题目

需求1:
int a = 10;
int b = 10;
int c = 10;
a = b++;
c = --a;
b = ++a;
a = c–;
请分别计算出a,b,c的值

int a = 10;
int b = 10;
int c = 10;
		
a = b++;// a=10,b=11 ,c=10
c = --a;// a=9 , b=11, c=9
b = ++a;//a=10,b=10, c=9
a = c--;//a=9, b=10,c=8
		
System.out.println("a:"+a);//9
System.out.println("b:"+b);//10
System.out.println("c:"+c);//8

需求2:
int x = 4;
int y = (x++)+(++x)+(x*10);
计算出x,y的值

class OperatorTest{
	public static void main(String[] args){
		//定义x变量
		int x = 4;
		int y = (x++)+(++x)+(x*10);
		//x = 4--->5
		//y = 4 + 6 + 60
		
		System.out.println("x:"+x);//6
		System.out.println("y:"+y);//70
		
	}
}

2、赋值运算符

	基本的赋值运算符:
		= 	 将=号右边的数据赋值给左边的某个类型的变量
	注意事项:千万不能讲"=",写成"=="	
	扩展的赋值运算符:
		+=,-=,*=,/=,%=
	+=: 将=号右边的值和左边的变量值相加,然后在将结果赋值给左边的变量a
	举例:		int a = 10 ;
		         a += 20 ;
class OperatorDemo{
	public static void main(String[] args){
		
		//定义一个变量
		int a = 10 ;//把10赋值给int类型的变量a
		
		//定义两个x,y变量
		int x , y ;
		x = y = 20 ;
		System.out.println("x:"+x+",y:"+y) ;
		System.out.println("------------") ;
		
		//int c ==  a ;
		boolean flag = (a ==y) ;
		System.out.println(flag);
		System.out.println("------------") ;
		int m = 20 ;
		m += a ;//好像是m=m+a
		System.out.println("m:"+m);
		
	}
}

思考题:
A)short s=1; s = s+1;
B)short s=1;s+=1;
上面两个代码有没有问题,如果有,哪里有问题?
A)有问题,不兼容的类型,损失精度
存在默认类型提升—>byte,short,char,在参与运算的时候默认提升—int类型
s+1的结果是int类型,使用short类型的变量接收int的值不可以的!
如何解决?只能强制类型转换 s = (short)(s+1) ;
B)没有问题,对于扩展赋值运算符+=… 隐藏了强制类型转换

class OperatorDemo2{
	public static void main(String[] args){
			
			//定义short变量
			//short s = 1 ;
			
			//报错:不兼容的类型: 从int转换到short可能会有损失精度
			//s = s +1 ;  
			
			//输出变量s
			//System.out.println("s:"+s);
			
			//变量s
			short s = 1;
			s += 1;//    等价于 s = (short)(s+1) ;
			System.out.println("s:"+s);
		
			
	}
}

3、比较运算符

比较(关系)运算符
>,>=,<=,<,!=,==

注意事项:
无论当前比较运算符连接的是简单的数据还是复杂的表达式,最终结果都是boolean类型

class OperatorDemo{
	public static void main(String[] args){
		
		//定义两个变量
		int x = 10 ;
		int y = 20 ;
		int z = 30 ;
		
		System.out.println(x > y) ;
		System.out.println((x+y) >= (x+z)) ;
		System.out.println("-------------------");
		
		System.out.println(x >= y) ;
		System.out.println(x < y) ;
		System.out.println(x <= z) ;
		System.out.println(x != y) ;
		System.out.println(x == y) ;
		System.out.println("-------------------");
		
		int a = 3 ;
		int b = 4 ;
		boolean flag = (a==b) ;  //flag接收的布尔值	
		//boolean flag =(a=b) ; //将b的值赋值给a,a的值留下来进行赋值	,报错:不兼容的类型: int无法转换为boolean	
	}
}

输出结果:
false
false
false
true
true
true
false

4、逻辑运算符

基本的逻辑运算符:
1、 逻辑与&
结论:有false,则false
2、逻辑或|
结论:有true,则true
3、逻辑异或^
结论:相同则为false,不同则为true
简单记忆:男女关系
男男 男女 女男 女女
4、逻辑非!
结论:非false,则true;非true则false
偶数个非是他本身!

class OperatorDemo{
	public static void main(String[] args){
		
		//定义三个变量
		int a = 3; 
		int b = 4 ;
		int c = 5 ;
		
		//逻辑与&
		System.out.println((a>b) & (a>c));//false & false  = false 
		System.out.println((a>b) & (a<c));//false & true   = false 
		System.out.println((a<b) & (a>c));//true & false = false 
		System.out.println((a<b) & (a<c));//true & true = true 
		System.out.println("-------------------");
		
		//逻辑或|
		System.out.println((a>b) | (a>c)); //false | false = false
		System.out.println((a>b) | (a<c)); //false | true = true
		System.out.println((a<b) | (a>c));//true | false = true 
		System.out.println((a<b) | (a<c));//true | true = true
		System.out.println("-------------------");
		
		//逻辑异或^
		System.out.println((a>b) ^ (a>c)); //false ^ false = false
		System.out.println((a>b) ^ (a<c)); //false ^ true =  true
		System.out.println((a<b) ^ (a>c)); //true ^ false =  true 
		System.out.println((a<b) ^ (a<c)) ;//true ^ true = false
		System.out.println("-------------------");
		
		//逻辑非
		System.out.println(!(a>b)) ;//!false = true
		System.out.println(!!(a>b)) ;//!!false = false
		System.out.println(!!!!(a>b));//false
	}
}

在这里插入图片描述
扩展的逻辑运算符:
1、逻辑双与&&
2、逻辑双或||

面试题:
		逻辑双与&& 和逻辑单与&的区别?
		a)&&和&都符合,有false,则false
		b)逻辑双与&&
		如果&&符号的左边表达式位false,右边就不执行了, (短路效果)
		逻辑||同理,左边的表达式为true,右边不执行了!
class OperatorDemo2{
	public static void main(String[] args){
	
		//定义三个变量
		int a = 3; 
		int b = 4 ;
		int c = 5 ;
		
		//逻辑双与&&
		System.out.println((a>b) && (a>c));
		System.out.println((a>b) && (a<c));
		System.out.println((a<b) && (a>c));
		System.out.println((a<b) && (a<c));
		System.out.println("-------------------") ;
		
		//定义两个变量
		int x = 3 ;
		int y = 4 ;
		
		//boolean flag = ((x++)==3 & (y++)==4) ;
		//boolean flag = ((x++)==3 && (y--)==4) ;
		boolean flag = ((++x)==3 && (y--)==4) ;
		
		System.out.println("x:"+x);//4 //4 //4
		System.out.println("y:"+y);//5 //3 //4  
		System.out.println("flag:"+flag);//true //false
 	}
}

在这里插入图片描述

5、位运算符

位与&:
有0则0
位或|:
有1则1
位异或^:
相同则为0,不同则为1
~ 反码:逐位取反,然后还需要通过得到补码---->原码
<<:左移
>>:右移
>>>:无符号右移

class OperatorDemo{
	public static void main(String[] args){
		
		System.out.println(3 & 4);//0
		System.out.println(3 | 4);//7
		System.out.println(3 ^ 4);//7
		System.out.println(~ 3);//-4
	}
}

首先,计算出这些数据的对应的二进制数据,然后进行位运算
十进制3---->二进制:11
十进制4---->二进制:100
在这里插入图片描述
在这里插入图片描述
位异或的特点:
一个数据位异或另一个数据两次,其值是他本身!
应用场景:简单的数据加密
高级加密: md5
安全框架(Spring security)

<<:左移动,最高位丢弃掉,右边补0
>>:右移,最高位如果是1,左边补1,最高位是0,左边补0
>>>:无符号右移
		最高位无论是1还是0,都补0

面试题:
有效的方式写出2乘以8的结果
答: 2 << 3

class OperatorDemo3{
	public static void main(String[] args){
		
		//<<
		//结论:将当前<<符号的左边的数据乘以2的移动次幂
		System.out.println(3 << 2);//3*2^2 = 12
		//>>
		//结论:将当前>>左边的数据除以2的移动次幂
		System.out.println(24 >> 3);//24/2^3 = 3
		System.out.println(24 >> 2) ;
		System.out.println(-24 >> 2) ;//-6
		//>>> 
		System.out.println(-24 >>> 2) ;//1073741818
	}
}

在这里插入图片描述
-24>>>2
在这里插入图片描述拓展:
面试题:
将两个数据的值进行互换
面试官考查---->位运算符中位异或特点

class OperatorTest{
	public static void main(String[] args){
		
		//定义两个变量
		int a = 10 ;
		int b = 20 ;
		
		//分别输出a,b
		System.out.println("a:"+a);
		System.out.println("b:"+b);
		System.out.println("--------------") ;
		
		//方式1:最常用的方式 :使用中间变量 (开发中常用)
		//定义一个中间变量
		
		int temp = a ; 
		a = b ;
		b = temp ;
		System.out.println("a:"+a);
		System.out.println("b:"+b);
			
		//方式2:位异或的特点 (面试过程中)
		//左边:a,b,a
		//右边:a ^ b
		/*
		a  = a ^ b ; 
		b  =  a ^ b ;//b =  a ^ b ^ b ; = a 
		a  = a ^ b ;//a = a ^ b ^ a ; = b
		System.out.println("a:"+a);
		System.out.println("b:"+b);
		*/
		
		//方式3:变量相加/相减
		/*
		a = a + b ; //a = 3 0; 
		b = a - b ;//b = 30 - 20 ;
		a = a - b ;//a = 30 -10 ;
		System.out.println("a:"+a);
		System.out.println("b:"+b);
		*/
		
		//方式4:一步走
		/*
		b = (a+b) - (a=b) ;
		System.out.println("a:"+a);
		System.out.println("b:"+b);
		*/
		
	}
}

6、三目运算符

单目 :a
二目:x + y
三元(三目)运算符(开发中经常用到)
格式:(表达式)? 执行true的结果:执行flase的结果;
三元运算符执行流程:
1)先判断表达式是否成立
2)如果成立,执行true的结果
3)不成立,执行false的结果

class OperatorDemo{
public static void main(String[] args){
		//定义两个变量
		int x = 100 ;
		int y = 200 ;
		
		//定义变量max
		int c = (x<y)? x : y;
		System.out.println("c:"+c);
		
		System.out.println("-----------------") ;
		
		int a = 3 ;
		int b = 4 ;
		
		//可以这样书写,但是"=="本身就是做比较,结果就是boolean类型
		//**注意**:boolean flag = (a==b)?true:false;
		boolean flag = a==b;
		//输出
		System.out.println(flag) ;
	}
}

拓展题目:

  没有说明数据类型,都默认使用int接收!
	1、获取两个整数中的最大值
	2、获取三个整数中的最大值
	3、比较两个整数是否相同
class OperatorTest{
	public static void main(String[] args){
		//获取两个整数中的最大值
		int a = 3 ;
		int b = 4 ;
		
		//三元运算符
		int max = ((a>b)? a : b);
		System.out.println("max:"+max);
		
		//获取三个整数中的最大值
		int x = 10 ;
		int y = 30 ;
		int z = 20 ;
		//方式1:使用中间变量的方式(三元)
		//定义变量temp
		int temp = ((x > y)? x : y);
		//使用temp和z进行比较
		int max2 = (( temp > z) ? temp : z) ;
		System.out.println("三个数据中的最大值是:"+max2);

		//方式2:直接使用三元一步走
		int max3 = (x > y)? ((x > z) ? x : z) :((y > z) ? y:z) ;
		//不推荐:在使用三元运算符的时候,一定要注意括号的使用
		//int max3 = x > y? x > z ? x : z :y > z ? y:z ;
		System.out.println("max3的值是:"+max3) ;
		System.out.println("--------------------");
		
		//比较两个整数是否相同
		int m = 100 ;
		int n = 120 ;
		
		//boolean flag = (m==n)? true :false ;
		boolean flag = m==n;
		System.out.println(flag) ;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值