zoukankan      html  css  js  c++  java
  • Java运算符

    运算符分类:

    • 算数运算符

    • 关系运算符

    • 位运算符

    • 逻辑运算符

    • 赋值运算符

    • 其他运算符

    算数运算符

    操作符描述例子
    +加法1+1=2
    -减法3-2=1
    *乘法2*3=6
    /整除,当两边为整数时,取整3/2=1
    3.0/2=1.5
    %取余7%5=2
    ++自增,符号在前,先自增再输出,符号在后,先输出再自增a=3
    System.out.println(a++); // 3
    System.out.println(++a); // 5
    --自减,符号在前,先自减再输出,符号在后,先输出再自减a=3
    System.out.println(a--); // 3
    System.out.println(--a); // 1

    关系运算符

    操作符描述例子
    ==检查如果两个操作数的值是否相等,如果相等则条件为真。1==1 true
    !=检查如果两个操作数的值是否相等,如果值不相等则条件为真。1!=1 false
    >检查左操作数的值是否大于右操作数的值,如果是那么条件为真。3>2 true
    <检查左操作数的值是否小于右操作数的值,如果是那么条件为真。3<2 false
    >=检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。3>=2 true
    <=检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。3<=3 true

    位运算符

    在计算机中,有符号的数据的表示法通常分为 原码、反码和补码三种形式,所有的数据运算都是采用补码的是形式进行。

    操作符描述
    &如果相对应位都是1,则结果为1,否则为0
    |如果相对应位都是 0,则结果为 0,否则为 1
    ^如果相对应位值相同,则结果为0,否则为1
    ~按位取反运算符翻转操作数的每一位,即0变成1,1变成0。
    <<按位左移运算符。左操作数按位左移右操作数指定的位数。
    >>按位右移运算符。左操作数按位右移右操作数指定的位数。
    >>>按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。

    实例:

    public class Test {
        public static void main(String[] args) {
            System.out.println(1&2);// 1:0001 / 2:0010 / 0000 1&2=0
            
            System.out.println(1|2);// 0011 1|2=3
            
            System.out.println(20 << 6);
            // 补码:0001 0100 / 移位:00 0101 0000 0000 / 20<<6=1280
            
            System.out.println(-20 >> 6);
            // 原码:1001 0100 / 反码:1110 1011 / 补码:1110 1100 / 移位:1111 1111 / 反码:1111 1110 / 原码:1000 0001 / -20>>6=-1
            
            System.out.println(20 >> 3);
            // 补码:0001 0100 / 移位:0000 0010 / 20>>3=2
            
            System.out.println(-20 << 3);
            // 补码:1110 1100 / 移位:111 0110 0000 / 反码:111 0101 1111 / 原码:100 1010 0000 / -20<<3=-160
            
            System.out.println(-20 >>> 3);
            // 32位的补码:1111 1111 1111 1111 1111 1111 1110 1100 / 移位:0001 1111 1111 1111 1111 1111 1111 1101 / -20>>>3=536870909
        }
    }
    

    注意:

    • 右移位运算符>> 若操作值为正,则在高位插入0,若为负,则在高位插1。

    • 右移补零运算符>>>无论操作值正负,均在高位插入0。

    • 右移补零运算符>>>和右移位运算符>>若操作值为正,则结果相同。

    • 无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位  无符号右移运算符>>> 只是对32位和64位的值有意义。

    逻辑运算符

    A为true,B为false

    操作符描述例子
    &&称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。A && B false
    ||称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。A || B true
    !称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。!A false

    赋值运算符

    操作符描述例子
    =简单的赋值运算符,将右操作数的值赋给左侧操作数C = A + B将把A + B得到的值赋给C
    +=加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数C + = A等价于C = C + A
    -=减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数C - = A等价于C = C - A
    *=乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数C * = A等价于C = C * A
    /=除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数C / = A,C 与 A 同类型时等价于 C = C / A
    (%)=取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数C%= A等价于C = C%A
    <<=左移位赋值运算符C << = 2等价于C = C << 2
    >>=右移位赋值运算符C >> = 2等价于C = C >> 2
    &=按位与赋值运算符C&= 2等价于C = C&2
    ^=按位异或赋值操作符C ^ = 2等价于C = C ^ 2
    |=按位或赋值操作符C | = 2等价于C = C | 2

    条件运算符( ? : )

    条件运算符也被称为三元运算符,该运算符有3个操作数,并且需要判断布尔表达式的值,该运算符的主要是决定哪个值应该赋值给变量。

    int a = 3>2 ? 1:0;
    

    判断条件是否成立,若成立将返回第一个值,反之返回第二个值。

    instanceof运算符

    该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或者接口类型)。

    String name = "zs";
    boolean result = name instanceof String; // true
    

    Java运算符优先级

    下表中具有最高优先级的运算符在表的最上面,最低优先级在表的底部。

    类别操作符关联性
    后缀() 、 [] 、 . (点操作符)从左到右
    一元expr++ 、 expr--从左到右
    一元++expr 、 --expr 、 ~ 、 !从右到左
    乘性* 、 / 、 %从左到右
    加性+ 、 -从左到右
    移位>> 、 >>> 、 <<从左到右
    关系> 、 >= 、 < 、 <=从左到右
    相等== 、 !=从左到右
    按位与&从左到右
    按位异或^从左到右
    按位或|从左到右
    逻辑与&&从左到右
    逻辑或||从左到右
    条件? :从右到左
    赋值= 、 += 、 -= 、 *= 、 /= 、 %= 、 >>= 、 <<= 、 &= 、 |= 、 ^=从右到左
    逗号,从左到右

    Java运算符括号和自增优先级问题:遇到括号时,默认从左到右计算,遇到括号立即执行括号里的内容。

    例题:

    1. 
    byte n = 5;
    System.out.println(n++ + n++ * n++); // 5 + 6 * 7 / 47
    
    2. 
    byte n1 = 5, n2 = 6;
    System.out.println(n1-- + n1 << 2 + n1++ * --n2 >>2); // 5 + 4 << 2 + 4 * 5 >> 2 / 9 << 22 >> 2 / 9 << 20 / 9 * 2的20次方 / 9437184
    
    3. 
    byte b1 = 8, b2 = 3;
    int num = b1-- - b2++ * (++b1 * b1 << 2);// 8 - 3 * (8 * 8 << 2) / 8 - 3 * (64 << 2) / 8 - 3 * 256 / -760
    System.out.println(num);
    
    4. 
    byte b1 = 7;
    byte b2 = 9;
    byte b3 = 10;
    byte b4 = 12;
    System.out.println(b1 | b2 ^ b3 & b4);
    // 7 | 9 ^ 10 & 12
    // 10 & 12 : 1010 & 1100 / 1000
    // 1000 ^ 9 : 1000 ^ 1001 / 0001
    // 0001 | 7 : 0001 | 0111 / 0111
    //7
    
  • 相关阅读:
    enmo_day_07
    enmo_day_04
    enmo_day_05
    数据仓库的模型设计
    Lucene 概念,定义应用场景
    enum 枚举的简单应用
    单例模式&synchronized
    Spark的 DAGschedule & task schedule 区别以及相互联系
    Spark的stage & job & task 到底是什么 ,以及划分原理
    Java基本数据类型&引用类型总结
  • 原文地址:https://www.cnblogs.com/zbh355376/p/14432059.html
Copyright © 2011-2022 走看看