运算符

算术运算符





取余

自加

自减

+

-

*

/

%

++

--

public class 算术运算符 {
    public static void main(String[] args) {
        int 被除数, 除数, 商, 余数;
        被除数 = 10;
        除数 = 3;
        商 = 被除数 / 除数;
        余数 = 被除数 % 除数;
        System.out.println("商:" + 商 + " 余数:" + 余数);
    }
}
public class 算术运算符 {
    public static void main(String[] args) {
        int 被除数, 除数, 商, 余数;
        被除数 = 10;
        除数 = 3;
        商 = 被除数 / 除数;
        余数 = 被除数 % 除数;
        System.out.println("商:" + 商 + " 余数:" + 余数);
    }
}

浮点数也能取余,把上述代码的int改为double:

商:3.3333333333333335 余数:1.0

另外,浮点数可以除以0:

商:Infinity 余数:NaN

比较运算符







>

<

>=

<=

==

!=

位运算符

用于操作整数类型(char也算入)

按位与

按位或

按位异或

补码取反

左移

右移

无符号右移

&

|

^

~

<<

>>

>>>

关于补码取反,参见:

位运算法则:

p

q

p&q(同1为1)

p|q(有1则1)

p^q(同0异1)

1

0

0

1

1

0

1

0

1

1

1

1

1

1

0

0

0

0

0

0

重点掌握:

  • >> 右移(除以2^n)
  • << 左移(乘以2^n)
public class 左移右移 {
    public static void main(String[] args) {
        int a;
        a = 512;
        System.out.println(a << 1);
        System.out.println(a >> 1);
        System.out.println(a >>> 1);
        a = -512;
        System.out.println(a << 1);
        System.out.println(a >> 1);
        System.out.println(a >>> 1);
    }
}
public class 左移右移 {
    public static void main(String[] args) {
        int a;
        a = 512;
        System.out.println(a << 1);
        System.out.println(a >> 1);
        System.out.println(a >>> 1);
        a = -512;
        System.out.println(a << 1);
        System.out.println(a >> 1);
        System.out.println(a >>> 1);
    }
}

对于int a=3,扩大8倍最快的方法是a<<3,即左移3位,相当于乘以23,计算机做位移的操作要被乘除快得多,比加法都快。

扩大2倍

a<<1

缩小2倍

a>>1

扩大4倍

a<<2

缩小4倍

a>>2

扩大8倍

a<<3

缩小8倍

a>>3

扩大16倍

a<<4

缩小16倍

a>>4

逻辑运算符

用于操作bool类型

运算符

说明

&&


AND,同真为真

||


OR,一荣俱荣



NOT

短路逻辑运算

以&&为例:

  • 两个操作数都为true时,结果才为true;
  • 第一个为false时,结果就必为false,这时不会再判断第二个操作
public class 短路逻辑运算 {
    public static void main(String[] args) {
        int a = 1;
        if ((a < 0) && (a++ < 1)) {
            // Do Nothing
        }
        System.out.println(a);
    }
}
public class 短路逻辑运算 {
    public static void main(String[] args) {
        int a = 1;
        if ((a < 0) && (a++ < 1)) {
            // Do Nothing
        }
        System.out.println(a);
    }
}

“短路逻辑运算”针对布尔类型数据,而位运算符针对整型数据。

运算符

说明

&

不短路与

|

不短路或

赋值运算符

等号运算符(=)左侧只能是变量;右侧不一定。
连续赋值:a = b = 3;降低可读性,不推荐使用。

扩展的赋值运算符:(x+=2相当于x=x+2)

+=

-=

*=

/=

%=

&=

|=

^=

<<=

>>=

>>>=

推荐使用扩展的赋值运算符:①代码更简洁②效率较高

public class 赋值运算符 {
    public static void main(String[] args) {
        byte a = 1;
        // 2是int,a+2自动提升为int类型
        // 再赋值给a,需要显式转换一下
        a = (byte) (a + 2);
        System.out.println(a);
        a = 1;
        a += 2;
        System.out.println(a);
    }
}
public class 赋值运算符 {
    public static void main(String[] args) {
        byte a = 1;
        // 2是int,a+2自动提升为int类型
        // 再赋值给a,需要显式转换一下
        a = (byte) (a + 2);
        System.out.println(a);
        a = 1;
        a += 2;
        System.out.println(a);
    }
}

运算符优先级


括号

( )

单目运算符

自加、自减、~、!

算术运算符

*/%

加减(+-)

位运算符1

位移(>>、<<、>>>)

比较运算符

大于小于

等于·不等于

位运算符2

按位与

按位异或

按位或

逻辑运算符

&&

||

三目运算符

?:


赋值运算符

含扩展赋值