JAVA常见的六类运算符

目录

1.算数运算符

1.1基本的四则运算(“+”、“-”、“ * ”、“/“、”%”)

1.2增量运算符 (“+=”、“-=”、“*=”、“%=”) 

1.3自增/自减运算符 (“++”、“--”) 

2关系运算符(“==”、“!=”、“<”、“>”、“<=”、“>=”)

3逻辑运算符(重点)(“&&”、“||”  、“!”)

3.1.1逻辑与 &&

3.1.2逻辑或 ||

3.1.3逻辑非!

4 位运算符(“&”、“|”、“~”、“^”)

4.1.1按位与" & "

4.1.2按位或" | "

4.1.3按位取反" ~ "     

4.1.4异或" ^ "   

5 移位运算(“<<”、“>>”、“>>>”)

5.1.1左移运算符<<

5.1.2右移运算符>>

5.1.3无符号右移运算符>>

6 条件运算符

运算符的优先级:

运算符的结合性:

技巧:如果记不清这些优先级的话,直接使用()去改变优先级。


2022_01_25学习运算符

什么是运算符?
        就拿咋们常说的加号“+”,减号 “-”来说,他们就是运算符。“+”就是进行加法运算的符号,“-”就是进行减法运算的符号。运算符就是进行运算的符号

运算符是干什么的?
        那继续举例呗,“+”是干嘛的,就是进行数字相加的呗,“-”是干嘛的,就是进行数字相减的呗。那“>”是进行干嘛的,进行数字比较的呗。总结下来,运算符就是对操作数进行操作的。


常见运算符

        算数运算符,关系运算符,逻辑运算符,位运算符,移位运算符,条件运算符...

1.算数运算符

1.1基本的四则运算(“+”、“-”、“ * ”、“/“、”%”)

        1.1.1.这些都是二元运算符,所谓二元运算符,就是需要两个操作数才能进行操作。
        1.1.2.使用过程中要注意自动类型转换
        1.1.3使用过程中的坑!:
                “/”除法运算
:int/int-->结果还是int类型,因为运算过程中没有double类型的数据,所  以 不会自动类型转化,并且还是向下取整。例如:5/2-->结果是2。同样的如果是double和int进行除法,那结果肯定会转为double类型。例如:5.0/2-->结果是2.5
             
  “%”取余运算:(求模运算):取余运算是干什么的?当然是取余数的喽。
注意:1.java中浮点数、整数都可以取余数,而在c语言中只允许整数取余数!
           2.无论是c语言还是java都不允许 分母为0的情况,也就是 1/0 或者1%0


1.2增量运算符 (“+=”、“-=”、“*=”、“%=”)
 举个例子就能明白:

int a = 1;
//给a加个2
a = a + 2;
//等价写法:
a += 2;

  会遇到的坑!!!:

short a = 10;
a = a + 1;//会报错 常量1默认是int,无法将高精度值赋给低精度
a += 1; // 正确 系统会自动进行转变

1.3自增/自减运算符 (“++”、“--”)
        举个例子:

1.后加加(指的是先使用该数字,使用完后加加)
int a = 1;
int b = a++;//先使用a,使用完后加加
System.out.println(b);//结果是1

2.后减减
int a = 1;
int b = a--;//先使用a,使用完后减1
System.out.println(b);//结果是1

3.先加加(先给该数字加1,然后使用)
int a = 1;
int b = ++a;//先给a加1,然后使用
System.out.println(b);//结果是2

4.先减减
int a = 1;
int b = --a;//先给a减1,然后使用
System.out.println(b);//结果是0

2关系运算符(“==”、“!=”、“<”、“>”、“<=”、“>=”)

        c和java的区别:c语言中关表达式的返回值可以用数字表示,0代表假,1代表真。

而在java中,不允许用数字表示,返回值只可能是true或者false。

        举个例子

int a = 1;
int b = 2;
int c = 1;
//java中
System.out.println (a > b);//结果:false
System.out.println (a == c);//结果:true
//c语言中
printf("%d", a > b);//结果:0
printf("%d", a == b);//结果:1

注意:c和java的区别

int a = 10;
//c语言中
if (9 < a < 11)//该写法成立 9<a为真返回1,1 < 11也为真,所以表达式为真
{
    ...
}

//java中
if (9 < a < 11)//该写法不成立,9<a为真返回true,boolean类型和int类型无法进行比较
{
    ....
}

3逻辑运算符(重点)(“&&”、“||”  、“!”)

3.1.1逻辑与 &&

规则:表达式1 && 表达式2,当表达式1和表达式2都为true时,该结果返回true,否则返回false。

坑:

表达式1 && 表达式2,当表达式1为false时,整个表达式就会返回flase,不会再去判断表达式2。

10/0-->会引起by Zero异常(分母不能为0)

/10>20为true,因此会执行第二个表达式10/0从而引发异常。
System.out.println(10 > 20 && 10 / 0 == 0);

//10<20为false,因此该语句就会结束并返回false,并不会去执行10/0,因此不会有异常。
System.out.println(10 < 20 && 10 / 0 == 0); // 打印 true

3.1.2逻辑或 ||

规则:表达式1 || 表达式2,当表达式1和表达式2都为flase时,该结果返回false,否则返回true。

坑:

表达式1 && 表达式2,当表达式1为true时,整个表达式就会返回true,不会再去判断表达式2。


3.1.3逻辑非!

规则:只能用在boolean变量上

//正确用法
boolean flag = ture;
if(!flag)//只能用在boolean类型上
{
    ...
}


//错误写法(该写法在c语言中能通过 但是在java中不行)
while(!1)
{
    ...
}


4 位运算符(“&”、“|”、“~”、“^”)

4.1.1按位与" & "

  两种用法:
          方法1.将两个二进制数的每一位进行比较,如果两个相同位均为1,则返回1,否则其他为0;

方法1举例:

int a = 5;
int b = 6;
System.out.println (a & b);//结果为4

//a变量的二进制为 0101
//b变量的二进制为 0110
//两者相与------&-------
//结果:         0100--->十进制为4

        方法2:和逻辑与具有同样的功能, 当表达式为boolean返回类型时,表达式1 & 表达式2,当表达式1和表达式2都为true时,该结果返回true,否则返回false。
        逻辑&&和按位&的区别:逻辑与在表达式1为假时,会直接结束语句,返回为flase。而按位与无论表达式1为真为假,都会将语句全部执行。
        方法2举例:

//按位与-->即使表达式1为假,也会执行表达式2(表达式都执行)
System.out.println(10 > 20 & 10 / 0 == 0);//结果:由于表达式2会报异常,无结果

//逻辑与-->表达式1为假,不会执行表达2
System.out.println(10 > 20 && 10 / 0 == 0);//结果:由于表达式1为假,结束语句。输出false。

4.1.2按位或" | "

两种用法:
          方法1.将两个二进制数的每一位进行比较,如果两个相同位均为0,则返回0,否则其他为1;

方法1举例:

int a = 5;
int b = 6;
System.out.println (a | b);//结果为7

//a变量的二进制为 0101
//b变量的二进制为 0110
//两者相与------|-------
//结果:          0111--->十进制为7

方法2:和逻辑或具有同样的功能, 当表达式为boolean返回类型时,表达式1 | 表达式2,当表达式1和表达式2都为false时,该结果返回false,否则返回true。
        逻辑&&和按位&的区别:逻辑或在表达式1为真时,会直接结束语句,返回为true。而按位与无论表达式1为真为假,都会将语句全部执行。
        方法2举例:

//按位或
System.out.println(10 < 20 | 10 / 0 == 0);//结果:由于表达式2会报异常,无结果

//逻辑或
System.out.println(10 < 20 || 10 / 0 == 0);//结果:由于表达式1为真,结束语句。输出true。

小结:

        1.逻辑与:只要表达式1为false,语句就结束,不会继续执行。
        2.逻辑或:只要表达式1为ture,语句就结束,不会继续执行。
        3.按位与:a.首先会有按位操作。b.也有逻辑与的功能,但是表达式1和2都必须全部执行。
        4.按位或:a.首先会有按位操作。b.也有逻辑或的功能,但是表达式1和2都必须全部执行。


4.1.3按位取反" ~ "
        就是将变量的二进制每一位取反,即0变1,1变0.
 

byte a = 5; // 补码:0000 0101    
a = (byte)~a;//取反:1111 1010
System.out.println(a);//结果为-6

运算过程:1111 1010是补码---->转为原码:1000 0110 也就是-6       

4.1.4异或" ^ "
        就是两个二进制数的每一位,如果相同则为0,不同为1。

        int a = 1;
        int b = 0;

        System.out.println(a^a);//最终结果为0
        //a^a
        //a:0000 0001
        //a:0000 0001
        //-^-----------
        //  0000 0000

        System.out.println(a^b);//最终结果为1
        //a^b
        //a:0000 0001
        //a:0000 0000
        //-^-----------
        //  0000 0001

5 移位运算(“<<”、“>>”、“>>>”)

5.1.1左移运算符<<

        简单来说,就是将最左侧的(最高位)二进制位移除掉,给最右侧(最低位)二进制位补0。左移的效果就是给该数字乘2的n次方(n代表左移的位数)

举例说明:

byte a = 63;//二进制0011 1111
System.out.println(a<<1);//结果126
//将0011 1111左移一位:
//(最高位移除一位,最低位补0)--->0111 1110

5.1.2右移运算符>>

        简单来说,就是将最右侧的(最低位)二进制位移除掉,给最左侧(最高位)二进制位补0或1
        如何判断最高位补0补1:看符号位,符号位是1就补1,符号位是0就补0(符号位就是最高位,即最左位)。

5.1.3无符号右移运算符>>

简单来说,就是将最右侧的(最低位)二进制位移除掉,给最左侧(最高位)二进制位补0

右移的效果就是给该数字除2的n次方(n代表右移的位数)

java和c的比较:
        这个时候就想到了c语言,c语言在对“符号类型”(比如int,有正负的数字)右移,最左位也是根据符号位的变化,符号位是1就补1,符号位是0就补0。但是没有“无符号右移>>>”,并不代表c语言不能表示,c语言会使用 unsigned 来代表无符号类型,这样右移的时候最高位都是补0。 


6 条件运算符

         规则:表达式1 ? 表达式2 : 表达式3
来解释解释,如果表达式1为true,则会执行表达式2,否则执行表达式3.

int a = 10;
int b = 20;
//如果a<b为真,则把10赋给c,否则把++b赋给c
int c = (a < b) ? 10 : ++b;
System.out.println(c);//结果:10

//等价写法
if (a < b)
{
    c = 10;
}
else
{
    c = ++b;
}

运算符的优先级:

        什么是运算符的优先级,举个大家都知道的例子,在数学中我们计算加减乘除的时候是不是先计算乘除后计算加减,这就说明乘除的优先级>加减的优先级。优先级就等于规定了计算的顺序。

运算符的结合性:

结合性分为了左结合性右结合性。
左结合性:左做到右进行运算。
右结合性:从右到左进行运算。

什么时候使用结合性?
        当优先级相同的时候我们就需要使用结合性!那什么时候优先级相同呢?
举个简单的例子

int a = 0;
a = 5*3/4;
//1.首先判断出来 *和/的优先级相同并且大于=的优先级
//2.*和/的优先级相同,那是先执行5*3还是先执行3/4呢?
//3.此时,通过查看,*和/是左结合性,也就是先执行5*3之后再/4
//4.执行完后,只剩下=运算了。

技巧:如果记不清这些优先级的话,直接使用()去改变优先级。

3+5*3--->加括号后(3+5)*3.

但是呢,还是建议去多练一练记一记,如果人家的代码就是没有(),那你还不是得去读,所以掌握根本才是最好的!!!

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值