史上最全运算符讲解

目录

一.算术运算符

二.算术运算符的深入

三.赋值运算符

四.关系运算符

五.Scannner类

六.字符串拼接符

七.逻辑运算符

八.表达式

九.三目运算符/三元运算符

十.位运算符

十一.运算符的优先级别


一.算术运算符

算数运算符符号:+,-,*,/,%,--,++

public class Test01{
		public static void main(String[] args){
            
			int num1 = 20;
			int num2 = 10;
			System.out.println(num1+num2);//30
			System.out.println(num1*num2);//200
			System.out.println(num1/num2);//0
			System.out.println(10%3);//1
			
			//a++先使用在加
			int a=10;	
			System.out.println(a++);//10
			System.out.println(a);//11
			
			//++b先加在使用
			int b=10;
			System.out.println(++b);//11
			System.out.println(b);//11
			
			//c--先使用在减
			int c=10;
			System.out.println(c--);//10
			System.out.println(c);//9
			
			//--d先减在使用
			int d=10;
			System.out.println(--d);//9
			System.out.println(d);//9
		
		}
}

 

二.算术运算符的深入

 案例一:byte类型做运算会向上转型成int类型再做运算

​
	    byte b1=10;
		byte b2=20;
		byte result=(byte)(b1+b2);
		System.out.println(result);

​

案例二:short类型做运算会向上转型成int类型再做运算

		short s1=10;
		short s2=20;
		short result=(short)(s1+s2);

案例三:除byte和short做运算会向上转型成int类型,其他数据做运算都是转向取值范围大的类型

        byte b=10;
		short s=10;
		int i=10;
		long i=10;
		float=10;
		double=10;
		System.out.println(b+b);//int
		System.out.println(b+s);//int
		System.out.println(b+i);//int
		System.out.println(s+s);//int
		System.out.println(s+i);//int
		System.out.println(i+l);//long
		System.out.println(l+f);//float
		System.out.println(l+d);//double
		System.out.println(f+d);//double

案例四:char类型做运算可以转化成int类型(获取其ASCII码),并且做运算

​
        char i='a';
		int x=i+1;
		System.out.println(x);//98

​

案例五:浮点类型做运算有失去精度的风险

		double d1 = 0.5;
		double d2 = 0.4;
		System.out.println(d1 - d2);//0.09999999999

案例六:a++;和++a没有区别,因为;表示执行语句的结束,不管先加还是后加都要加

		int a = 0;
		a++;
		System.out.println(a);//1
		
		int b =0;
		++b;
		System.out.println(b);//1

经典面试题1:输出结果为?

		int a = 8;
		int b=(a++)+(++a)+a*a;
		System.out.println(b);//118	

经典面试题2:输出结果为?

	    int i = 0 ;
		i=++i;
		System.out.println(i);//1
		//基层原理:
		//i=(int)i+1;
		//i=i;

经典面试题3:输出结果为?

		int i = 0 ;
		i=i++;
		System.out.println(i);//0
		//基层原理:
		//int temp =i;//底层有个变量temp记录了i的初始值
		//i=(int)i+1;
		//i=temp

三.赋值运算符

赋值运算符符号:=,+=,-=,*=,/=,%=,

public class Test01{
		public static void main(String[] args){
            
            int num = 10;
			num += 5; //num = (int)(num+5);
			num -= 5; //num = (int)(num-5);
			num *= 5; //num = (int)(num*5);
			num /= 5; //num = (int)(num/5);
			num %= 3; //num = (int)(num%3);
            System.out.println(num);//1
	}
}            

经典面试题一:输出结果为?

		int a,b; //一次性声明多个变量
		a = b = 100;//将100赋值给b,再把b赋值给a
		System.out.println(a);//100
		System.out.println(b);//100

经典面试题二:下面的两种写法结果分别是?

		short s = 1; 
		s = s+1; //会报错,s是short类型,1是int类型,计算结果的类型是int,必须强转
		short s=1; 
		s += 1;//底层实现:s = (short)(s+1);

赋值规则 s     + = 1                               s = (T) ((s)   +    (1))

复合赋值 E1 op= E2等价于简单赋值 E1 = (T)((E1) op (E2)), 其中T是E1的类型。

四.关系运算符

关系运算符符号:==、!=、>、>=、<、<=

public class Test01{
		public static void main(String[] args){
        int num1 = 20;
		int num2 = 10;
		boolean bool = num1 == num2;
		System.out.println(bool);//false
		System.out.println(num1 != num2);//true
		System.out.println(num1 > num2);//true
		System.out.println(num1 >= num2);//true
		System.out.println(num1 < num2);//false
		System.out.println(num1 <= num2);//false 
	}
}            

经典面试题一:输出结果为?

		int x = 10;
		int y = 10;
		boolean flag = (x == y);
		System.out.println(flag);//true
		flag = (x = y);//会报错,因为boolean类型不能与其他类型兼容
		System.out.println(flag);

经典面试题二:输出结果为?

		boolean b1 = true;
		boolean b2 = false;
		boolean b3 = (b1 == b2);
		System.out.println(b3);//false
		boolean b4 = (b1 = b2);

总结:1.=是赋值号,==是判断两个值是否相同

            2.关系运算符的结果一定是boolean

五.Scannner类

知识点:Scanner类

含义:Java给我们提供的专门在控制台(cmd)输入数据的类

import java.util.Scanner;
public class Test05{
    public static void main(String[] args){
		
		//创建Scanner类的对象
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入int类型的数据:");
		int i = scan.nextInt();
		System.out.println("请输入double类型的数据:");
		double d = scan.nextDouble();
		System.out.println("请输入String-字符串类型的数据:");
		String str = scan.next();
		System.out.println(i);
		System.out.println(d);
		System.out.println(str);
	}
}

六.字符串拼接符

字符串拼接符符号:+

public class Test06{
	public static void main(String[] args){
        System.out.println(1 + 2 + "abc" + "def" + 1 +2); //"3abcdef12"
    }
}    

总结:+两侧都是数值,该符号为算数运算符

           +有一侧是字符串或两侧都是字符串,该符号为字符串拼接符

七.逻辑运算符

逻辑运算符符号: &与 ,&&短路与  , |或  ,   ||短路或 ,^异或 ,!非

&与:前后两侧都是接boolean值,两者都成立(true),结果才为true

		System.out.println(true & true);//true
		System.out.println(true & false);//false
		System.out.println(false & true);//false
		System.out.println(false & false);//false

&& 短路与:前后两侧都是接boolean值,两者都成立(true),结果才为true

		System.out.println(true && true);//true
		System.out.println(true && false);//false
		System.out.println(false && true);//false
		System.out.println(false && false);//false

& vs &&

& :前者为false后,还会判断后者

&&:前者为false后,不会判断后者,效率更高

		//ArithmeticException -- 算数异常
		System.out.println(false & 10/0>5);//ArithmeticException 
		System.out.println(false && 10/0>5);//false

|或:前后两侧都是接boolean值,有一侧成立(true),结果就为true

		System.out.println(true | true);//true
		System.out.println(false | true);//true
		System.out.println(true | false);//true
		System.out.println(false | false);//false

||短路或:前后两侧都是接boolean值,有一侧成立(true),结果就为true

		System.out.println(true || true);//true
		System.out.println(false || true);//true
		System.out.println(true || false);//true
		System.out.println(false || false);//false

| vs ||

| :前者为true后,还会判断后者

||:前者为true后,不会判断后者,效率更高

		System.out.println(true | 10/0>5);//ArithmeticException
		System.out.println(true || 10/0>5);//true

^异或:前后两侧都是接boolean值,相同为false,不同为true

		System.out.println(true ^ true);//false
		System.out.println(false ^ true);//true
		System.out.println(true ^ false);//true
		System.out.println(false ^ false);//false

!非:置反,true变成false,false变成true

		boolean bool1 = true;
		System.out.println(!bool1);//false
		boolean bool2 = false;
		System.out.println(!bool2);//true

注意: 1.逻辑运算符运行结果都是boolean类型

            2.&、&&、|、||、^ 两侧都是boolean类型数据

八.表达式

含义:描述某个语句

5 + 6 算数表达式 ​

5 > 6 关系表达式

九.三目运算符/三元运算符

语法结构: 数据类型 变量 = (表达式)?值1:值2;

理解: 表达式的结果必须是boolean

                true - 将值1赋值给变量

                false- 将值2赋值给变量

做实验:

		int num = (false)?10:20;
		System.out.println(num);

需求1:输入两个int值,获取最大值

		Scanner scan = new Scanner(System.in);
		System.out.println("请输入第一个数字:");
		int a = scan.nextInt();
		System.out.println("请输入第二个数字:");
		int b = scan.nextInt();
		int max = (a>b)?a:b;
		System.out.println("最大值为:" + max);

需求2:输入两个int值,获取最小值

		Scanner scan = new Scanner(System.in);
		System.out.println("请输入第一个数字:");
		int a = scan.nextInt();
		System.out.println("请输入第二个数字:");
		int b = scan.nextInt();
		int min = (a<b)?a:b;
		System.out.println("最小值为:" + min);

需求3:输入三个int值,获取最大值

        Scanner scan = new Scanner(System.in);
        System.out.println("请输入第一个数字:");
        int a = scan.nextInt();
        System.out.println("请输入第二个数字:");
        int b = scan.nextInt();
        System.out.println("请输入第三个数字:");
        int c = scan.nextInt();
        int max = (a>b)?a:b;
        max = (max>c)?max:c;
		System.out.println("最大值为:" + max);

需求4:输入三个int值,由小到大输出

		Scanner scan = new Scanner(System.in);
        System.out.println("请输入第一个数字:");
        int a = scan.nextInt();
        System.out.println("请输入第二个数字:");
        int b = scan.nextInt();
        System.out.println("请输入第三个数字:");
		int c = scan.nextInt();
		//最大值
        int max = (a>b)?a:b;
        max = (max>c)?max:c;
        //最小值
        int min = (a<b)?a:b;
        min = (min<c)?min:c;
        //中间值
        int mid = a + b + c - max - min;
		System.out.println(min + "<" + mid + "<" + max);

扩展面试题1:值1和值2都是常量的情况,按照取值范围大的类型返回

		int a = 5;
		System.out.println((a<5)?10.9:9);//9.0

扩展面试题2:值1和值2都是变量的情况,按照取值范围大的类型返回

        char x = 'x';//ASCII - 120
        int i = 10;
        System.out.println(false?i:x);//120

扩展面试题3:

        char x = 'x';//ASCII - 120
        System.out.println(false?100:x);//x
		System.out.println(false?65536:x);//120

三目运算符的返回值规则:

1.值1和值2都是常量的情况,按照取值范围大的类型返回

2.值1和值2都是变量的情况,按照取值范围大的类型返回

3.值1和值2一个是常量一个是变量的情况,常量是否在变量所属类型的取值范围里:

在:就按变量类型返回数据 ,不在:就按常量类型返回数据

十.位运算符

含义:将十进制的数据转换为二进制再做运算

位运算符符号: & 与、| 或、^ 异或, <<左移, >>右移, >>>无符号位右移

	int i1 = 27;//0000,0000,0000,0000,0000,0000,0001,1011
	int i2 = 21;//0000,0000,0000,0000,0000,0000,0001,0101
	//&:同位比较,两者为1,结果才为1
	System.out.println(i1 & i2);//17 - 0000,0000,0000,0000,0000,0000,0001,0001
	//|:同位比较,两者有1,结果就为1
	System.out.println(i1 | i2);//31 - 0000,0000,0000,0000,0000,0000,0001,1111
	//^:同位比较,两者相同为0,不同为1
	System.out.println(i1 ^ i2);//14 - 0000,0000,0000,0000,0000,0000,0000,1110

&、|、^ 符号两侧都是数值,该符号为位运算符

&、|、^ 符号两侧都是boolean值,该符号为逻辑运算符

<<左移:整体向左移动n位,就用n个0补位
int i1 = 1024;//0000,0000,0000,0000,0000,0100,0000,0000
System.out.println(i1 << 2);//4096- 0000,0000,0000,0000,0001,0000,0000,0000
>>右移:整体向右移动n位,就用n个符号位补位
int i2 = 100;//0000,0000,0000,0000,0000,0000,0110,0100
System.out.println(i2 >> 2);//25 - 0000,0000,0000,0000,0000,0000,0001,1001
int i3 = -100;//1111,1111,1111,1111,1111,1111,1001,1100
System.out.println(i3 >> 2);//-25 - 1111,1111,1111,1111,1111,1111,1110,0111
>>>无符号位右移:整体向右移动n位,就用n个0补位
注意:无符号位右移正数和右移没有区别
System.out.println(i2 >>> 2);//25 - 0000,0000,0000,0000,00000000,0001,1001
System.out.println(i3 >>> 2);//10亿多 - 0011,1111,1111,1111,1111,1111,1110,0111

面试题1:用最有效率的方式计算出2*8

System.out.println(2<<3);

面试题2:说出以下代码的输出结果

考点:char类型的取值范围没有负数,向上转型使用0补位

//-1 int:1111,1111,1111,1111,1111,1111,1111,1111
//(byte):1111,1111
//(char):1111,1111,1111,1111
//(int) :0000,0000,0000,0000,1111,1111,1111,1111
System.out.println((int)(char)(byte)-1);//65535

十一.运算符的优先级别

经验:不用记,灵活运用小括号即可

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值