03 运算符


运算符

对常量和变量进行操作的符号称为运算符。

运算符的分类:

  • 算术运算符: +, - , * , / , % , ++ , –
  • 赋值运算符: =, +=,-=,*=,/=,%=
  • 比较运算符: == ,!= , < , > , <= , >= , instanceof(后面讲解)
  • 逻辑运算符: &(并且) , |(或者) , !(非) , ^(异或) , &&(短路与) , ||(短路或)
  • 位运算符: &(与),|(或),^(异或) , ~(按位取反) , <<(左移) ,>>(右移) ,>>>(无符号右移)
  • 三目运算符: (关系表达式) ? 表达式1 : 表达式2;

运算符的优先级(从高到低)——如果在程序中,要改变运算顺序,可以使用()
括号 ()、[]
正负号 +、-
自增自减,非 ++、–、!
乘除,取余*、/、%
加减 +、-
移位运算 <<、>>、>>>
大小关系 >、>=、<、<=
相等关系 ==、!=
按位与 &
按位异或 ^
按位或 |
逻辑与 &&
逻辑或 ||
条件运算 ?:
赋值运算 =、+=、-=、*=、/=、%=
位赋值运算 &=、|=、<<=、>>=、>>>=


算术运算符

+, - , * , / , % , ++ , –

  • 注意事项:
    a:整数相除只能得到整数。如果想得到小数,请使用浮点数
    b:/获取的是除法操作的商,%获取的是除法操作的余数。 %运算结果的符号,取决于参与运算是左边的符号
		//运算符:对常量或变量进行操作的符号
		//数学运算符,比较运算符,逻辑运算符,三目运算符,位运算符 ,赋值运算		
		//算数运算符有哪些	+ , - , * , / , % , ++ , -- 
			int a=10;
			int b=3;
		System.out.println(a/b); //3  /取商 两个整数相除,结果的商  整数相除只能得到整数
		System.out.println(a%b);//1   %取余数 余数为1
		
			int a=10;
			int b=3;
		System.out.println(a/b*1.0);//输出为3.33333	//*1.0表示为提升为double类型 	

++,–运算符:
++:自加。对原有的数据进行+1
–:自减。对原有的数据进行-1
a:单独使用:
放在操作数的前面和后面效果一样。(这种用法是我们比较常见的)
b:参与运算使用:
放在操作数的前面,先自增或者自减,然后再参与运算。++1
放在操作数的后面,先参与运算,再自增或者自减。1++

		// ++ 自增1   -- 自减1
		int i=1;
		//++  -- 单独使用,放在前面和放在后面没有区别
		i++; //自身+1 //i变为2
		++i;
		i--;
		--i;
			
		// ++  --  混合使用
	   int i=1;
	   int j=++i; //混合使用 ++ -- 在前 先运算 后使用//i=2 j=2
	   int h=i--;//          ++ -- 在后 先使用 后运算//h=2 i=1
		System.out.println("i的值是:"+i); // 1
		System.out.println("h的值是:"+h);//  2
		System.out.println("j的值是:"+j); // 2

+除了有相加的意思,有的时候,还会作为一个连接符
+运算的两端,只要任意一端,为一个字符串,就会起拼接的作用,将两端的内容拼接起来形成一个新的字符串

char ch1='a';
		char ch2='b';
		int r=ch1+ch2; //r为195 //+ 起一个相加的作用
		
		int a=10;
		int b=20;
		int num=a+b;
		System.out.println("2"+num+"1"); //"2301"
		System.out.println(10+20+"0");//"300" //运算从左往右进行
		System.out.println("0"+10+20+"0");//"010200"
		System.out.println("hello" + 'a' + 1); // "helloa1"
		System.out.println('a' + 1 + "hello"); //  "98hello"
		System.out.println("5+5="+5+5); //"5+5=55"
		System.out.println(5+5+"=5+5"); //"10=5+5"

赋值运算符

=, +=,-=,*=,/=,%=

  • 注意事项:
    a:基本的赋值运算符:=
    把=右边的数据赋值给左边。
    b:扩展的赋值运算符:+=,-=,*=,/=,%=
    += 把左边和右边做加法,然后赋值给左边。
    c: 赋值运算符要求左边的数据必须是一个变量
		//赋值运算符有哪些	=, +=,-=,*=,/=,%=
		int a=10;//把右边的常量10 赋值给左边int类型的变量a
		a=a+10; //a为20  //从右往左
		a+=10;//等价于 a=a+10  //+= 累加 //+= 把左边和右边做加法 然后赋值给左边
		
		byte a=10;
		a=(byte)(a+120);//强制类型转换
	 System.out.println(a);
		byte b=10;
		b+=120;  //  +=   自动会强制类型转换 不会报错
	 System.out.println(b);	

关系运算符

== ,!= , < , > , <= , >= , instanceof(后面讲解)

  • 注意事项:
    无论你的操作是简单还是复杂,结果是boolean类型。
    “==“不能写成”=”。
	     //关系运算符有哪些  == ,!= , < , > , <= , >= , instanceof(后面讲解)
		// =  和 == 区分 ; 比较两个数据是否相等  用 ==
		// 比较运算符的运算结果 是boolean —— true 或 false
		 int a=10;
		 int b=20;
		 boolean r=a==b; //false
				 r=a>b; //false
				 r=a<b; //true
				 r=a<=b;//<= 为 <或=
				 r=a!=b;//!= 为 不等于

逻辑运算符

&(并且) , |(或者) , !(非) , ^(异或) , &&(短路与) , ||(短路或)

  • 注意事项:
    a:逻辑运算符一般用于连接boolean类型的表达式或者值。
    在Java中我们要表示一个数大于3并且小于6 ,不可以写成3<x<6,应该写成 x>3 & x<6 。
    b:表达式:就是用运算符把常量或者变量连接起来的符合java语法的式子。
    算术表达式:a + b
    关系表达式:a == b

&逻辑与:有false则false。
|逻辑或:有true则true。
^逻辑异或:相同为false,不同为true。举例:情侣关系。男男,男女,女男,女女
!逻辑非:非false则true,非true则false。特点:偶数个不改变本身。

 //逻辑运算符   & | ! || &&
        // &(并且) , |(或者), !(非) , ^(异或) , &&(短路与) , ||(短路或)
        //逻辑运算符的运算结果是布尔类型
        int a = 20;
        int b = 100;
        //&的两端只要任意一端为false 那么最终结果就是false  只要两端都为true 其最终结果才为true
        boolean r = a > 10 & b < 10;// true & false 为 false 
        //| 的两端只要任意一端为true 其最终结果都是true 只有两端都为false 其最终结果才是false
                r = a > 10 | b < 100;// true | false 为 true
        // ^(异或) 相同为false 不同为true // 男男  女女 false      男女  女男 true
        boolean flag = true ^ true;//true ^ true 为 false  
                flag = false ^ true;//false ^ true 为 true
        // ! 取反 true变false false 变true
        System.out.println(!(1 > 0));//!(true) 为 false

  • &&和&的区别?
    a:最终结果一样。
    b:&&具有短路效果。左边是false,右边不执行。
  • ||和|的区别?
    a:最终结果一样。
    b:||具有短路效果。左边是true,右边不执行。
    (开发中常用 &&,||,!)
  //  &(并且) , |(或者), 和 &&(短路与) , ||(短路或) 的区别
      //  & 和 && 他们两个运算的最终结果没有任何区别,区别在于运算效率上
        int a=1;
        int b=2;
        boolean flag=a==1&(b++)>2;//true & false(++在后边 先运算 再自加) 为 false 
        System.out.println(flag);//false
        System.out.println(b);//3
             //& 他的两端都会去运算
            //&& 左端为false 右端就不运算了  当然你左端为true了那右端,还必须运算
               flag=a>1&&(b++) > 2;//左端a>1为false 结果为false 不计算右端了 此式子中(b++)不进行 
        System.out.println(flag);//false
        System.out.println(b);//3
        
        //  |  和 ||  最终的运算的结果没有区别,区别只是效率上的
        int num1=10;
        int num2=20;
        // | 两端都会运算
        // || 当他左端为true了右端就不运算了,只有左端为false时右端就得运算一下
        boolean f=num1==10||++num2>20;//左端为true 右端不运算 
        System.out.println(f);//true
        System.out.println(num2);//20

位运算符

&(与),|(或),^(异或) , ~(按位取反) , <<(左移) ,>>(右移) ,>>>(无符号右移)
注意事项:位运算是直接对二进制补码进行运算。

&:有0则0
|:有1则1
^:相同则0,不同则1
~:按位取反 0变1 1变0
<<:左移 空位补0,被移除的高位丢弃。
>>:右移 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,高位补1。
>>>:无符号右移 被移位二进制最高位无论是0或者是1,空缺位都用0补。

    //位运算符:了解  直接对补码进行运算,运算效率比较高
        //  &(与),|(或),^(异或), ~(按位取反) , <<(左移) ,>>(右移) ,>>>(无符号右移)                    
        byte a = 3; //
        byte b = 5; //
        // 0  0000011  3的补码
        // 0  0000101  5的补码
        //   --------------------------------------------       
        System.out.println(a & b);//为0; 0000000   // & 有0则0
        System.out.println(a | b);//为7;  0000111   // | 有1则1
        System.out.println(~3);//为—4;1 1111100为3按位取反后 的补码转化为原码后就是—4//~按位取反
        //<<:左移	空位补0,被移除的高位丢弃。
        //>>:右移	被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,高位补1。
        //>>>:无符号右移	被移位二进制最高位无论是0或者是1,空缺位都用0补。
        System.out.println(3 >> 2); //为0//把3右移2位 00 0  00000
        System.out.println(3 >>> 2); //把3右移2位   00 0  00000
        System.out.println(-3 >> 2); //为-1

^ : 一个数据被另一个数据位异或两次,该数本身不变。 自己位异或自己是0 8^8 结果是0
<<: 把<<左边的数据乘以2的移动次幂 例如 10<<3 结果 10*2^3=80
>> 把>>左边的数据除以2的移动次幂 例如 40>>3 结果 40/2^3=5

// 结论:一个数 被另一个数位异或两次该数不变
        System.out.println(2 ^ 3 ^ 3);//为2
        System.out.println(2 ^ 5 ^ 2);//为5  //5被2位异或两次
        System.out.println(10 ^ 10);//为0  //自己和自己位异或 为0
        
		//<< :把 << 左边的数据乘以2的移动次幂 例如 10 << 3 结果 10 * 2 ^ 3 = 80
        //>> :把 >> 左边的数据除以2的移动次幂 例如 40 >> 3 结果 40 / 2 ^ 3 = 5
        System.out.println(2 * 4);//为8
        System.out.println(2 << 2);//为8  //位运算符2<<2比2*4效率更高

三元运算符

三元(三目)运算符的格式
(关系表达式) ? 表达式1 : 表达式2;
int a=(10>20)?30:50; //a=50

三元运算符的执行流程
计算关系表达式的值,如果为true, 运算后的结果是表达式1;
如果为false,运算后的结果是表达式2;

//三元运算符
        //格式:   表达式?结果1:结果2
        //看表达式的结果是true 返回结果1 是false 返回结果2
        int a=100;
        int b=200;
        int r=a>b?a:b;
        System.out.println("最大值是:"+r);//最大值是:200

        // 获取三个数的最大值
        int a=10;
        int b=2;
        int c=900;
        int max1=a>b?a:b;
        int max=max1>c?max1:c;        
        //写成一个式子的话 max= (a > b ? a : b) > c ? (a > b ? a : b) : c;  阅读性不好
        System.out.println("最大值是"+max);	//最大值是900   
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值