天天看点

JAVA编程思想之操作符

  • 赋值

赋值使用操作符“=”。取右边的值(右值),把它复制给左边(即左值)。右值可以是任何常数、变量或表达式(只要它能生成一个值就行)。

  • 算术操作符

算数操作符包括加号(+)、减号(-)、除号(/)、乘号(*)以及取模操作符(%,它从整数除法中产生余数)。

  • 自动递增和递减

递减操作符“--”,减少一个单位;递增操作符(++),增加一个单位。

前缀递增表示“++”操作符位于变量或表达式的前面;后缀递增是“++”操作符位于变量或者表达式的后面。前缀递减和后缀递减类似递增。

对于前缀递增和前缀递减(++a或--a),会先执行运算,再生成值;后缀递增和后缀递减(a++或a--),会先生成值,再执行运算。

  • 关系操作符

关系操作符生成的是一个boolean(布尔)结果,它们计算的是操作数的值之间的关系。

运算符 含义 说明 实例 结果
> 大于运算符 只支持左右两边操作数是数值类型。如果前面变量的值大于后面变量的值, 则返回 true。 2>3 false
>= 大于或等于运算符 只支持左右两边操作数是数值类型。如果前面变量的值大于等于后面变量的值, 则返回 true。 4>=2 true
< 小于运算符 只支持左右两边操作数是数值类型。如果前面变量的值小于后面变量的值,则返回 true。 2<3 true
<= 小于或等于运算符 只支持左右两边操作数是数值类型。如果前面变量的值小于等于后面变量的值, 则返回 true。 4<=2 false
== 相等运算符

如果进行比较的两个操作数都是数值类型,无论它们的数据类型是否相同,只要它们的值不相等,也都将返回 true。

如果两个操作数都是引用类型,只有当两个引用变量的类型具有父子关系时才可以比较,只要两个引用指向的不是同一个对象就会返回 true。

Java 也支持两个 boolean 类型的值进行比较。

4==4

97=='a'

5.0==5

true==false

true

true

true

false

!= 不相等运算符

如果进行比较的两个操作数都是数值类型,无论它们的数据类型是否相同,只要它们的值不相等,也都将返回 true。

如果两个操作数都是引用类型,只有当两个引用变量的类型具有父子关系时才可以比较,只要两个引用指向的不是同一个对象就会返回 true。

4!=2 true
  • 逻辑操作符

逻辑运算符把各个运算的关系表达式连接起来组成一个复杂的逻辑表达式,以判断程序中的表达式是否成立,判断的结果是 true 或 false。

运算符 用法 含义 说明 实例 结果
&& a&&b ab 全为 true 时,计算结果为 true,否则为 false。 2>1&&3<4 true
|| a||b ab 全为 false 时,计算结果为 false,否则为 true。 2<1||3>4 false
! !a a 为 true 时,值为 false,a 为 false 时,值为 true !(2>4) true
  • 按位操作符

按位运算符是来操作整数基本数据类型中的单个“比特”(bir),即二进制位,位运算符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。

位运算符来源于C语言面向底层的操作,在这种操作中经常需要直接操作硬件,设置硬件寄存器内的二进制位。Java的设计初衷是为了嵌入电视机机顶盒,所以种面向底层的操作仍被保留了下来。

(1)“与”、“位与”(&)

        按位“与”操作符,如果两个数的二进制,相同位数都是1,则该位结果是1,否则是0.

  例1 5&4

        5的二进制是  0000 0000 0000 0101

        4的二进制是  0000 0000 0000 0100

        则结果是        0000 0000 0000 0100  转为十进制是4。

(2)“或”、“位或”(|)

        按位“或”操作符,如果两个数的二进制,相同位数有一个是1,则该位结果是1,否则是0

  例2  5 | 4

        5的二进制是  0000 0000 0000 0101

      4的二进制是  0000 0000 0000 0100

        则结果是        0000 0000 0000 0101  转为十进制是5。

(3)“异或、“位异或”(^)

        按位“异或”操作符,如果两个数的二进制,相同位数只有一个是1,则该位结果是1,否则是0

  例3  5 ^ 4

        5的二进制是  0000 0000 0000 0101

        4的二进制是  0000 0000 0000 0100

        则结果是        0000 0000 0000 0001 转为十进制是1 

(4)“非”、“位非”(~)也称为取反操作符

        按位“非”操作符,属于一元操作符,只对一个操作数进行操作,(其他按位操作符是二元操作符)。按位“非”生成与输入位相反的值,——若输入0,则输出1,若输入1,则输出0。

  例4  ~5

        5的二进制是  0000 0000 0000 0101

        则~5是           1111 1111 1111 1010  转为十进制是 -6。

  • 移位操作符

移位运算符它主要包括:左移位运算符(<<)、右移位运算符(>>>)、带符号的右移位运算符(>>),移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数。

  1. 左移运算符用“<<”表示,是将运算符左边的对象,向左移动运算符右边指定的位数,并且在低位补零。其实,向左移n 位,就相当于乘上2 的n 次方,例如下面的例子。

public class test{

    public static void main(String[] args) {

        int a=2,b=2,c;

        c=a<<b;

        System.out.print("a 移位的结果是"+c);

    }

}

输出结果:8

分析上面代码,2 的二进制是00000010,它向左移动2 位,就变成了00001000,即8。如果从另一个角度来分析,它向左移动2 位,其实就是乘上2 的2 次方,结果还是8

  1. 右移运算符无符号用“>>>”表示,是将运算符左边的对象向右移动运算符右边指定的位数,并且在高位补0,其实右移n 位,就相当于除上2 的n 次方

public class test{

    public static void main(String[] args) {

        int a=16;

        int b=2;

        System.out.println("a 移位的结果是"+(a>>>b));

    }

}

输出结果 :4

分析上面代码:16 的二进制是00010000,它向右移动2 位,就变成了00000100,即4。如果从另一个角度来分析,它向右移动2 位,其实就是除以2 的2 次方,结果还是4

  1. 带符号右移运算符用“>>”表示,是将运算符左边的运算对象,向右移动运算符右边指定的位数。如果是正数,在高位补零,如果是负数,则在高位补1

public class test{

    public static void main(String[] args) {

        int a=16;

        int c=-16;

        int b=2;

        int d=2;

        System.out.println("a 的移位结果:"+(a>>b));

        System.out.println("c 的移位结果:"+(c>>d));

    }

}

输出结果: 4和-4

分析上面代码:

a 的值是16转换成二进制是00010000,让它右移两位成00000100 即4,c 的值是-16转换成二进制是11101111,让它右移一位成11111011 即-4

  • 截尾和舍入

在执行窄化转换时,必须注意截尾与舍入的问题。

 public static void main(String[] args) {

        double above = 0.7, below = 0.4;

        float fabove = 0.7f, fbelow = 0.4f;

        System.out.println("int above:" + (int)above);

        System.out.println("int below:" + (int)below);

        System.out.println("int fabove:" + (int)fabove);

        System.out.println("int fbelow:" + (int)fbelow);

    }

输出结果:

int above:0

int below:0

int fabove:0

int fbelow:0

因此答案是在将float或double转型为整型值时,总是对该数字执行截尾。

如果想要得到舍入的结果,就需要使用java.lang.Math中的round()方法:

public static void main(String[] args) {

        double above = 0.7, below = 0.4;

        float fabove = 0.7f, fbelow = 0.4f;

        System.out.println("Math.round() above:" + Math.round(above));

        System.out.println("Math.round() below:" + Math.round(below));

        System.out.println("Math.round() fabove:" + Math.round(fabove));

        System.out.println("Math.round() fbelow:" + Math.round(fbelow));

    }

输出结果:

Math.round() above:1

Math.round() below:0

Math.round() fabove:1

Math.round() fbelow:0