java—运算符详解(看一遍就懂)

想详细了解清楚运算符,就先要了解各个名词概念
运算:对常量和变量进行操作的过程
运算符:对常量和变量进行操作的符号
操作数:参与运算的数据
表达式:用运算符将常量和变量连接起来组成的式子(不同运算符连接的式子体现的是不同类型的表达式)

一.算术运算符

  • 算术运算符的运算规则遵循四则运算规律 — 先算小括号,再算乘除,最后算加减
运算符      ~~~~ 运算      ~~~~      ~~~~ 范例      ~~~~      ~~~~ 结果      ~~~~
+ 正号 +3 3
- 负号 b=4; -b=? -4
+ 5+5 10
- 6-4 2
* 3*4 12
/ 5/5 1
% 取模 5%5 0
++ 自增(前) a=2;b=++a; a=3;b=3;
++ 自增(后) a=2;b=a++; a=3;b=2;
- - 自减(前) a=2;b=- -a; a=1;b=1;
- - 自减(后) a=2;b=a- -; a=1;b=2;
+ 字符串连接 “he”+“llo” “hello”
  • 代码演示
    public class CalcDemo{
    	public static void main(String[] args){
    		int a = +3;
    		System.out.println(a);//3
    		int b = 4;
    		System.out.println(-b);//-4
    		
    		System.out.println(5+5);//10
    		System.out.println(6-4);//2
    		System.out.println(3*4);//12
    		System.out.println(5/5);//1
    		System.out.println(5%5);//0
    		
    		int c = 2;
    		int d = ++c;
    		System.out.println(c);//3
    		System.out.println(d);//3
    		
    		int e = 2;
    		int f = e++;
    		System.out.println(e);//3
    		System.out.println(f);//2
    		
    		int g = 2;
    		int h = --g;
    		System.out.println(g);//1
    		System.out.println(h);//1
    
    		int i = 2;
    		int j = i--;
    		System.out.println(i);//1
    		System.out.println(j);//2
    		
    		System.out.println("he"+"llo");// hello
    	}
    }

    关于自增和自减
    只要存在自增和自减符号,那么该变量的值最后一定会 +1 或 -1
    即当 自增 和 自减 单独使用时,符号在前在后所得的结果都一样
    当自增和自减符号参与运算(赋值、打印、小括号等)时:
    前自增:先 +1 ,再运算
    后自增:先运算,后 +1
    前自减:先 -1 ,再运算
    后自减:先运算,后 -1

二.赋值运算符

  • 赋值运算符有:= 、+= 、-=、*=、/=、%=
  • = 是最基本的赋值运算符,其余的都是根据 = 扩展而成
  • += :将运算符两边的数字相加,结果赋值给左边变量(其余同理,更换标记部分的符号)
  • eg:a += b; 等同于 a = a + b;
    //代码演示
    public class GiveValueDemo{
    	public static void main(String[] args){
    		int a = 13;
    		int b = 2;
    		System.out.println(a+=b);//15,a=a+b;a=15
    		System.out.println(a-=b);//13,a=a-b;a=13
    		System.out.println(a*=b);//26,a=a*b;a=26
    		System.out.println(a/=b);//13,a=a/b;a=13
    		System.out.println(a%=b);//1,a=a%b;a=1
    
    		System.out.println(a=b);//2
    		System.out.println(a==b);//true
    	}
    }
  • 除了 = 外,其余赋值运算符中都包含了强制类型转换
    //代码演示
    public class ChangeValueDemo{
    	public static void main(String[] args){
    		short s = 1;
    		s = s + 1;//此句错误,因为等号右边存在变量,s+1的值为int类型,不能赋给short类型的s
    		s += 1;//此句正确,s = 2,已经在内部完成了强制类型转换,即 s = (short)(s + 1)
    	}
    }

三.关系运算符

  • 关系运算符又称为比较运算符,得到的结果都为boolean类型
运算符     ~~~ 运算     ~~~     ~~~ 范例     ~~~     ~~~ 结果     ~~~
== 恒等于 4==3 false
!= 不等于 4!=3 true
< 小于 4<3 false
> 大于 4>3 true
<= 小于等于 4<=3 false
>= 大于等于 4>=3 true
instanceof 检查是否是类的对象 “hello” instanceof String true

注意:

  • instanceof 不能用于检查基本数据类型,只能用于检查引用数据类型
  • == 运算符,在连接基本数据类型时,比较的是数值是否相等;连接引用数据类型时,比较的是地址值
  • “==” 不要误写为 “=”
//代码演示
public class CompareDemo{
	public static void main(String[] args){
		System.out.println(4==3);//false
		System.out.println(4!=3);//true
		System.out.println(4<3);//false
		System.out.println(4>3);//true
		System.out.println(4<=3);//false
		System.out.println(4>=3);//true
		System.out.println("hello" instanceof String);//true
	}
}

四.逻辑运算符

  • 逻辑运算符一般用于连接布尔类型的值,或者连接结果为布尔类型值的表达式

    & - 并且(AND):运算符两边全为true,最后结果才为true,否则都为false
    | - 或者(OR):运算符两边只要存在true,结果就为true,两边全为false,结果为false
    ^ - 异或(XOR):运算符两边相同为false,不同为true
    !- 非 :对某布尔类型的值或表达式取反

    //代码演示
    public class LogicDemo{
    	public static void main(String[] args){
    		boolean b1 = true;
    		boolean b2 = false;
    		System.out.println(b1&b2);//false
    		System.out.println(b1|b2);//true
    		System.out.println(b1^b2);//true
    		System.out.println(!(b1&b2));//true
    		System.out.println(4>3 & 5>6);//false
    		//表达式可以连接多个
    	}
    }
  • 逻辑运算符的优先级:& > | > ^ (AND > OR > XOR)
  • 短路运算符

    短路与:&&
    & 和 && 的运算结果在任何时候都是相同的
    & 和 && 不能随意调换,在 & 运算中,若后面的结果取决于前面的结果时,就不能调换,此时只能用 &
    使用 & 时,若前面的结果已经出现false,后面的表达式仍要进行计算,最终结果为false
    使用 && 时,若前面的结果已经出现false,后面的表达式就不再进行计算,最终结果为false
    短路或:||
    与短路与同理(前面出现true,则最终结果为true,后面表达式不会再执行)

    //代码演示
    public class AndDemo{
    	public static void main(String[] args){
    		int x1 = 3;
    		int y1 = 4;
    		System.out.println((x1++ > 3)&(y1++ > 4));//false
    		System.out.println(x1);//4
    		System.out.println(y1);//5
    		
    		int x2 = 3;
    		int y2 = 4;
    		System.out.println((x2++ > 3)&&(y2++ > 4));//false
    		System.out.println(x2);//4
    		System.out.println(y2);//4
    
    		//y1=5,y2=4
    
    		int x3 = 3;
    		int y3 = 4;
    		System.out.println((++x3 > 3)|(++y3 > 4));//true
    		System.out.println(x3);//4
    		System.out.println(y3);//5
    
    		int x4 = 3;
    		int y4 = 4;
    		System.out.println((++x4 > 3)||(++y4 > 4));//true
    		System.out.println(x4);//4
    		System.out.println(y4);//4
    
    		//y3 = 5,y4 = 4
    	}
    }
  • &、|、^ 三个运算符也可以用来连接数字,此时这三个运算符称为 — 位逻辑运算符(针对二进制位进行操作)

    位逻辑运算符连接的数字只能是整数
    运算过程:先将整数转为二进制数,再逐位进行运算,把0当成false,1当成true

    public class Demo{
    	public static void main(String[] args){
    		System.out.println(15&2);//2
    		System.out.println(15|2);//15
    		System.out.println(15^2);//13
    	}
    }

    具体过程:
    15的二进制数:00000000 00000000 00000000 00001111
    2的二进制数:     ~~~ 00000000 00000000 00000000 00000010
    &                     ~~~~~~~~~~~~~~~~~~~ 00000000 00000000 00000000 00000010 ----> 2
    |                      ~~~~~~~~~~~~~~~~~~~~ 00000000 00000000 00000000 00001111 -----> 15
    ^                     ~~~~~~~~~~~~~~~~~~~ 00000000 00000000 00000000 00001101 -----> 13

五.位运算符

  • 位运算符分为位左移运算符、位右移运算符
  • 位右移运算符中又分为无符号右移和有符号右移
  • 位运算是直接对二进制进行运算
运算符 运算 范例
<< 左移 3 << 2 = 12(3 * 2 * 2 = 12)
>> 右移 3 >> 1 = 1(3/2 = 1)
>>> 无符号右移 -10 >>> 2 = 1073741821

   ~~ << :空位补0,被移除的高位丢弃
   ~~ >> :   ~ 被移位的二进制最高位是0,右移后空缺位补0;最高位是1,空缺位补1
  ~ >>> : 无论最高位是0还是1,右移后空缺位都补0

左移 x 位,相当于乘 2 的 x 次方
右移 x 位,相当于除 2 的 x 次方

六.三目运算符

  • 三目运算符也称为三元运算符
  • 格式:(关系表达式)?表达式1:表达式2;
  • 此处关系表达式的数据类型是布尔类型
  • 若关系表达式为true,结果为表达式1,否则为表达式2
  • 表达式1和2的最终结果是一个明确的值
    //代码演示
    public class ThreeEyesDemo{
    	public static void main(String[] args){
    		int a = 100;
    		int b = 20;
    		int max = (a>b)?a:b; 
    		System.out.println(max);//100
    
    		String s = (a<b)?"ssss":"bbbbb";
    		System.out.println(s);//bbbbb
    	}
    }
    //三目运算符嵌套案例1
    //需求:分数>=90:A,80-89:B,70-79:C,60-69:D,60以下:E
    public class StudentScoreDemo{
    	public static void main(String[] args){
    		int score = 77;
    		String level = score>=90?"A":score>=80?"B":score>=70?"C":score>=60?"D":"E";
    		System.out.println(level);//C
    	}
    }
    //三目运算符嵌套案例2
    //需求:找出a,b,c三个整数的最大值
    public class SearchMax{
    	public static void main(String[] args){
    		int a = 10;
    		int b = 20;
    		int c = 30;
    		//第一种方法:
    		int max1 = a>b?a:b;
    		int max2 = max1>c?max1:c;
    		System.out.println(max2);
    		//第二种方法:
    		int max3 = a>b?a>c?a:c:b>c?b:c;
    		System.out.println(max3);
    		//第三种方法:
    		int max4 = a>b? && a>c? a:b>c?b:c;
    		System.out.println(max4);
    	}
    }
  • 注意事项:

    当三目运算符的值被接收时,表达式 1 和 表达式 2 所得值的数据类型必须一致
    eg:int a = 10; int b = 20; int max = a>b?a:b;
    此处a,b,max 都为 int 类型
    当三目运算符的值不被接收时,表达式 1 和 表达式2 所得值的数据类型可以不同
    eg:int a = 10; int b = 20; a<b?“hhh”:b;
    此处 a 和 b 为 int 类型,表达式1为String类型,此句可直接进行打印,即
    System.out.println(a<b?“hhh”:b);//输出结果为 hhh

猜你喜欢

转载自blog.csdn.net/weixin_42419342/article/details/106918926