【Java基本语法-运算符】

本文详细介绍了Java中的运算符,包括算术运算符(如除法、取模)、赋值运算符、比较运算符、逻辑运算符、位运算符以及三元运算符的使用方法和实例。通过实例演示,帮助读者理解运算符在编程中的实际操作和应用场景。
摘要由CSDN通过智能技术生成

运算符的概念

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
>算术运算符
>赋值运算符
>比较运算符(关系运算符)
>逻辑运算符
>位运算符
>三元运算符

算术运算符

+、 -、 *、/、 % 、 (前)++、(后)++、(前)-- 、(后)- -、(拼接)+

除号:a / b,a是被除数。

  	  int num = 12;
      int num2 = 5;
      int result1 = num/num2;
      System.out.println(result1);//2

      int result2 = num/num2*num2;
      System.out.println(result2);//10

      double result3 = num/num2;
      System.out.println(result3);//2.0

      double result4 = num/num2+0.0;//2.0
      double result5 = num/(num2+0.0);//2.4 强制类型转换,相当于double result5 =(num+0.0)/num2;或double result5 = (double)num/num2;
      double result6 = num/(double)num2;//2.4
      System.out.println(result6);

%取模:a%b,a是被模数。

结果的正负符号与被模数一致。
开发中,经常使用%来判断能否被除尽的情况。

		int m1 = 12;
        int n1 = 5;
        int l1= m1%n1;
        System.out.println(l1);//2

        int m2 = -12;
        int n2 = 5;
        int l2= m2%n2;
        System.out.println(l2);//-2

        int m3 = 12;
        int n3 = -5;
        int l3= m3%n3;
        System.out.println(l3);//2

        int m4 = -12;
        int n4 = -5;
        int l4= m4%n4;
        System.out.println(l4);//-2

(前)++、(后)++

(前)++:先自增1,然后再运算。: ++i
(后)++:先运算,后自增1。 : i++

		int a1 = 10;
        int b1 = ++a1;
        System.out.println("a1="+a1+",b1="+b1);//a1=11,b1=11,因为前++是先自增1再运算,所以是a1先自增1后再做赋值运算给了b1,所以b1也是11。

        int a2 = 10;
        int b2 = a2++;
        System.out.println("a2="+a2+",b2="+b2);//a2=11,b2=10,因为后++是先运算后自增1,所以b2是先被a2赋值运算后,再自增了1。

        //注意点:
        short s1 = 10;
        //s1=s1+1;编译错误 1是int型的,不能拿表数范围更小的short型的s1去接收
        s1=(short) (s1+1);
        s1++;
        s1+=1;
        System.out.println(s1);//13

        //问题:
        byte bb1 = 127;
        bb1++;
        System.out.println(bb1);//-128,因为byte是1个字节8个bit,127在内存中的二进制码是11111111,此时加00000001就变成了100000000,因为只有8个bit,
                                //所以最高位1被截断,变成了00000000,就是-128;

(前)- -、(后)- -

与自增逻辑相同

		int a4 = 10;
        int b4 = a4--;
        System.out.println("a4="+a4+",b4="+b4);//a4=9,b4=10

        int a5 = 10;
        int b5 = --a5;
        System.out.println("a5="+a5+",b5="+b5);//a5=9,b5=9

赋值符号:=

当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。
支持连续赋值。
扩展赋值运算符: +=, -=, *=, /=, %=

		int i1 = 10;
        int j1 = 10;

        int i2,j2;
        i2=j2= 10;//连续赋值

        int i3=10,j3=20;

        short num1 = 10;
        num1+= 2;//类似num1 = num1 + 2;但是不会改变数据类型。
        System.out.println(num1);//12

        int num3 = 12;
        num3 %= 5;//类似num3 = num1 % 5;但是不会改变数据类型。
        System.out.println(num3);//2

        //开发中,如果希望变量实现+2的操作,有几种方法?(前提是:int num  = 10)
        //方式一:num = num + 2;
        //方式二:num += 2;(推荐)

        //开发中,如果希望变量实现+1的操作,有几种方法?(前提是:int num  = 10)
        //方式一:num = num + 1;
        //方式二:num += 1;
        //方式三:num++/++num;(推荐)

比较运算符

比较运算符: == 、!= 、>、 <、 >= 、<= 、instanceof
>比较运算符的结果都是boolean型,也就是要么是true,要么是false
>比较运算符“==”不能误写成“=”

		 int i = 10;
         int j = 20;
         System.out.println(i==j);//false
         System.out.println(i=j);//20

        boolean b3 = true;
        boolean b6 = false;
        System.out.println(b3==b6);//false
        System.out.println(b6=b3);//true

逻辑运算符

逻辑运算符:

& :逻辑与|:逻辑或!:逻辑非
&&:短路与||:短路或^:逻辑异或
aba&ba&&ba | ba || b!a!ba^b
truetruetruetruetruetruefalsefalsefalse
truefalsefalsefalsetruetruefalsetruetrue
falsetruefalsefalsetruetruetruefalsetrue
falsefalsefalsefalsefalsefalsetruetruefalse

a&b : a与b都是true,结果为true。否则结果为false。
a&&b:同a&b。
a | b:a与b都是false,结果为false,否则结果为true。
a||b:同a|b。
!a:结果与a相反。
a^b:a与b相同,结果为false。不同,结果为true。

逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 。
“&”和“&&”的区别:
单&时,左边无论真假,右边都进行运算;
双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
“|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。
异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。
理解:异或,追求的是“异”!

区分&和&&:
相同点1:&与&&的运算结果相同,都需要满足两者都是true。所以叫做与或且。
相同点2:当符号左边是true时,二者都会执行符号右边的运算。
不同点:当符号左边是false时,&继续执行符号右边的运算,&&不再执行符号右边的运算。
开发中推荐&&

		boolean bo1 = true;
        int numm = 10;
        if(bo1 & (numm++>0)){
            System.out.println("北京");//bo1=true,numm=11>0也是true,true & true,所以执行北京。
        }else{
            System.out.println("南京");
        }
        System.out.println(numm);//11

        boolean bo2 = true;
        int numm2 = 10;
        if(bo2 && (numm2++>0)){
            System.out.println("北京");//bo2=true,numm2=11>0也是true,true & true,所以执行北京。
        }else{
            System.out.println("南京");
        }
        System.out.println(numm2);//11

        boolean bo3 = false;
        int numm3 = 10;
        if(bo3 & (numm3++>0)){
            System.out.println("北京");
        }else{
            System.out.println("南京");//bo3=false,继续看numm3++执行后是否大于0,false & true,所以执行南京。
        }
        System.out.println(numm3);//11

        boolean bo4 = false;
        int numm4 = 10;
        if(bo4 && (numm4++>0)){
            System.out.println("北京");
        }else{
            System.out.println("南京");//bo4=false,不再看numm4++执行后是否大于0,false所以执行南京。
        }
        System.out.println(numm4);//10

区分|和||:和上面同理
相同点1:|和||的运算结果相同,只要有一个true就行。
相同点2:当符号左边是false时,二者都会执行符号右边的运算来检测右边是否为true。
不同点:当符号左边是true时,|继续执行符号右边的运算,而||不再执行符号右边的运算。
开发中推荐||

	   boolean bo5 = false;
       int numm5 = 10;
       if(bo5 | (numm5++>0)){
           System.out.println("北京");//bo5=false,继续看numm5++执行后是否大于0,false | true,所以执行北京。
       }else{
           System.out.println("南京");
       }
       System.out.println(numm5);//11

       boolean bo6 = false;
       int numm6 = 10;
       if(bo6 || (numm6++>0)){
           System.out.println("北京");//bo6=false,继续看numm6++执行后是否大于0,false | true,所以执行北京。
       }else{
           System.out.println("南京");
       }
       System.out.println(numm6);//11

       boolean bo7 = true;
       int numm7 = 10;
       if(bo7 | (numm7++>0)){
           System.out.println("北京");//bo7=true,继续看numm7++执行后是否大于0,true | true,所以执行北京。
       }else{
           System.out.println("南京");
       }
       System.out.println(numm7);//11

       boolean bo8 = true;
       int numm8 = 10;
       if(bo8 || (numm8++>0)){
           System.out.println("北京");//bo8=true,不再看numm8++执行后是否大于0, true,所以执行北京。
       }else{
           System.out.println("南京");
       }
       System.out.println(numm8);//10

位运算符

位运算符:
位运算是直接对整数的二进制进行的运算

运算符表示范例
<<左移3 << 2 = 12 --> 322=12
>>右移3 >> 1 = 1 --> 3/2=1
>>>无符号右移3 >>> 1 = 1 --> 3/2=1
&与运算6 & 3 = 2
|或运算6 | 3 = 7
^异或运算6 ^ 3 = 5
~取反运算~6 = -7

位运算符的细节
<< : 空位补0,被移除的高位丢弃,空缺位补0。
>> : 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1。
>>> : 被移位二进制最高位无论是0或者是1,空缺位都用0补。
& : 二进制位进行&运算,只有1&1时结果是1,否则是0;
| : 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1;
^ : 相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0,不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1
~ : 正数取反,各二进制码按补码各位取反,负数取反,各二进制码按补码各位取反。

位运算符操作的都是整型数据
<<:在一点范围内,每向左移1位,相当于*2
>>:在一点范围内,每向右移1位,相当于/2

  	  int ii1 = 21;
      System.out.println("ii1<<2="+(ii1<<2));//84
      System.out.println("ii1<<3="+(ii1<<3));//168
      System.out.println("ii1<<27="+(ii1<<27));//-1400.....左移27位刚好把1停在了int的第32位,所以变成了负数。

与,或,异或:
&
0 0 0 0 1 1 0 0 = 12
0 0 0 0 0 1 0 1 = 5
0 0 0 0 0 1 0 0 = 4
|
0 0 0 0 1 1 0 0 = 12
0 0 0 0 0 1 0 1 = 5
0 0 0 0 1 1 0 1 = 13
^
0 0 0 0 1 1 0 0 = 12
0 0 0 0 0 1 0 1 = 5
0 0 0 0 1 0 0 1 = 9

 		int m = 12;
        int n = 5;
        System.out.println("m&n="+(m&n));//4
        System.out.println("m|n="+(m|n));//13
        System.out.println("m^n="+(m^n));//9

        //取反,正数和负数都直接二进制取反(包括符号位),得到它的取反。

        int a =6;
        System.out.println("~a="+(~a));

三元运算符

1、结构:(条件表达式)?表达式1:表达式2
2、说明
①条件表达式的结构为boolean类型
②根据条件表达式真或假,决定执行表达式1,还是表达式2
如果条件表达式为true,则执行表达式1
如果条件表达式为false,则执行表达式2
③表达式1和表达式2,可以不是一种类型,但是至少可以被同一种类型接收。
④三元运算符是可以嵌套使用的
3、凡是可以使用三元运算符的地方,都可以改写为if-else语句,反之不成立。
4、如果程序即可以使用三元运算,又可以使用if-else语句,那么优先使用三元运算。原因:简洁,效率高。

		int mm = 12;
        int nn = 5;
        int max = (mm>nn)?mm:nn;
        System.out.println(max);//12

        double nummm =(mm>nn)?2:1.0;//表达式1和表达式2,可以不是一种类型,但是至少可以被同一种类型接收。
        //  (mm>nn)?"m大":nn; 编译错误,表达式1和表达式2不能被同一种类型接收。

        nn=12;
        String maxStr = (mm>nn)?"m大":(mm==nn)?"m和n一样大":"n大";//可以嵌套使用
        System.out.println(maxStr);//一样大

        //三个数字求大小
        //方法一:推荐
        int nn1 = 12;
        int nn2 = 30;
        int nn3 = -43;

        int max1 = (nn1>nn2)?nn1:nn2;
        int max2 = (max1>nn3)?max1:nn3;
        System.out.println(max2);//30

        //方法二:不推荐
        int max3 =(((nn1>nn2)?nn1:nn2)>nn3)?((nn1>nn2)?nn1:nn2):nn3;
        System.out.println(max3);//30

        //改写成if-else语句
        if(mm>nn){
            System.out.println(mm);
        }else{
            System.out.println(nn);
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值