1、概念

  对常量和变量进行操作的符号

2、分类

  算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、三目运算符

3、详解

  A、算术运算符

    +、-、*、/、%、++、--
    +:在java中有三种作用,代表正号,做加法运算,字符串连接符。
    整数相除只能得到整数。若想得到小数,需把其中一个数据类型转换为浮点型。
    /:获得的是两数相除的商;%获得的是两数相除的余数。
    %运算规则:
      左边的绝对值小于右边的绝对值时,结果是左边
      左边的绝对值等于或者是右边的绝对值的倍数时,结果是0
      左边的绝对值大于右边的绝对值时,结果是余数
    自加(++),自减(--)运算符:
      ++,自加,对原有数据进行+1
      --,自减,对原有数据进行-1
    ++、--用法:

    a、单独使用

      int a = 1; a++/++a/a--/--a; System.out.println(a);

    b、参与运算

      放在操作数的前面,先进行自增或者自减,在参与运算
      放在操作数的后面,先运算,再进行自增或者自减   
1 int a = 3;
2 int b;
3 b = a++;
4 c = ++a;
5 System.out.println("a = "+a);
6 System.out.println("b = "+b);
7 System.out.println("c = "+c);

    c、问题:哪句代码会出错?理由是什么?

1 byte b = 10;
2 b++; //运算符,底层还会自动转换类型,相当于b = (byte)(b + 1)
3 b = b + 1;//int转换byte可能会损失精度(运算时,类型转换为int,而b是byte类型)
4 System.out.println(b);

  B、赋值运算符

    a、基本的赋值运算符:=
      作用:将运算符右侧的值赋值给左边的变量
      a = 10;
    b、扩展:+=、-=、*=、/=、%=
      +=:把左边和右边的值相加,再赋值给左边。
      -=:把左边和右边的值相减,再赋值给左边。
      *=:把左边和右边的值相乘,再赋值给左边。
      /=:把左边和右边的值相整除,再赋值给左边。
      %=:把左边和右边的值求余数,再赋值给左边。

    c、问题:查看程序是否有问题,请指出

1 short s1 = 1; 
2 s = s + 1; //类型错误,高类型向低类型转换
3 short s1 = 1; 
4 s += 1; //2

  C、关系运算符(比较运算符)

    a、运算符

      ==、!=、>、>=、<、<=

    b、注意

      结果为boolean类型,即不为true,就为false

  D、逻辑运算符

    a、运算符

      &、|、^、!、&&、||(注意:逻辑运算符一般用于连接boolean类型的表达式)
      &:逻辑与(and),只有符号两边同时为true时,结果方为true(有false,则false)
      |:逻辑或(or),只有符号两边同时为false时,结果为false(有true,则true)
      ^:逻辑异或,同时为true或为false时,结果为false(两边相同为false,两边不同为true)
      !:逻辑非,取反操作(非true,为false)
      &&:逻辑与,只有符号两边同时为true时,结果方为true(有false,则false);与&不同的是,&&当遇到符号左边为false时,右边不在执行(短路效果)  
1 int a = 10;int b = 15;
2 //System.out.println((++a == 10) & (++b == 15));
3 //System.out.println(a); //11
4 //System.out.println(b); //16
5 System.out.println((++a == 10) && (++b == 15));
6 System.out.println(a); //11
7 System.out.println(b); //15
      ||:逻辑或,只有符号两边同时为false时,结果为false(有true,则true);与|不同的是||只要满足一个条件,后面的条件就不再进行判断(短路效果),而|则对所有的条件进行判断。
int a = 10;int b = 15;
System.out.println((++a == 11) | (++b == 15));
System.out.println(a); //11
System.out.println(b); //16
//System.out.println((++a == 11) || (++b == 15));
//System.out.println(a); //11
//System.out.println(b); //15

    b、案例演示

 1 class Demo_Operator {
 2     public static void main(String[] args) {
 3         //&、|、^、!
 4         //0<x<1
 5         //x>0 & x<1;//&:逻辑与、并且、and
 6         int a,b,c;
 7         a = 10;
 8         b = 15;
 9         c = 20;
10         System.out.println("a < b & b < c结果为:" + (a < b & b < c)); //true & true = true
11         System.out.println("a < b & b > c结果为:" + (a < b & b > c)); //true & false = false
12         System.out.println("a > b & b < c结果为:" + (a > b & b < c)); //false & true = false
13         System.out.println("a > b & b > c结果为:" + (a > b & b > c)); // false & false = false
14         //&:只有两边同时为true时,结果方为true;
15         System.out.println("a < b && b < c结果为:" + (a < b && b < c)); //true & true = true
16         System.out.println("a < b && b > c结果为:" + (a < b && b > c)); //true & false = false
17         System.out.println("a > b && b < c结果为:" + (a > b && b < c)); //false & true = false
18         System.out.println("a > b && b > c结果为:" + (a > b && b > c)); // false & false = false
19         //&&:只有两边同时为true时,结果方为true;遇到false,下面的不执行
20         System.out.println("a < b | b < c结果为:" + (a < b | b < c)); //true & true = true
21         System.out.println("a < b | b > c结果为:" + (a < b | b > c)); //true & false = true
22         System.out.println("a > b | b < c结果为:" + (a > b | b < c)); //false & true = true
23         System.out.println("a > b | b > c结果为:" + (a > b | b > c)); // false & false = false
24         //|:只有两边同时为false时,结果才为false;
25         System.out.println("a < b ^ b < c结果为:" + (a < b ^ b < c)); //true & true = false
26         System.out.println("a < b ^ b > c结果为:" + (a < b ^ b > c)); //true & false = true
27         System.out.println("a > b ^ b < c结果为:" + (a > b ^ b < c)); //false & true = true
28         System.out.println("a > b ^ b > c结果为:" + (a > b ^ b > c)); // false & false = false
29         //^:两边相同为false,两边不同为true
30         System.out.println("!true结果为:"+(!true)); // false
31         System.out.println("!false结果为:"+(!false)); // true
32         
33     }
34 }

  E、位运算符

    a、运算符

      &、|、^、~、>>、>>>、<<、

    b、案例演示

        &:位与,有0则0
        |:位或,有1则1
        ^:位异或,相同则0,不同则1
        System.out.println(4 ^ 5 ^ 5); //4 一个数被另一个数异或两次,该数本身不变。
        ~:取反,按位取反
        代码:
 1 class Demo_Opertor1 {
 2     public static void main(String[] args) {
 3         /*
 4         位运算符
 5         &、|、^、~
 6         &:有0则0
 7         |:有1则1
 8         ^:相同则0,不同则1
 9         ~:按位取反
10         */
11         System.out.println(6 & 3); //2
12         //将6转换为二进制:110;3转换为二进制:011
13         //有0则0
14         /*
15             110
16         &    011
17         -----------
18             010
19         */
20         System.out.println(6 | 3); //7
21         //将6转换为二进制:110;3转换为二进制:011
22         //有1则
23         /*
24             110
25         |    011
26         -----------
27             111
28         */
29         System.out.println(6 ^ 3); //5
30         //将6转换为二进制:110;3转换为二进制:011
31         //相同则0,不同则1
32         /*
33             110
34         ^    011
35         -----------
36             101
37         */
38         System.out.println(~6); //-7
39         //将6转换为二进制:110;3转换为二进制:011
40         //按位取反
41         /*
42         ~    00000000 00000000 00000000 00000110
43             11111111 11111111 11111111 11111001  取反(负数补码)
44         -1     00000000 00000000 00000000 00000001
45         ------------------------------------------------------
46             11111111 11111111 11111111 11111000 反码 (高位不变,其他位取反)
47             10000000 00000000 00000000 00000111 -7
48         */
49         System.out.println(4 ^ 5 ^ 5); //4   一个数被另一个数异或两次,该数本身不变。
50     }
51 }

    c、练习:交换两个整数位置(不需要第三方变量)

 1 class Demo_opertor {
 2     public static void main(String[] args) {
 3         int a = 10;
 4         int b = 20;
 5         //方法1
 6         a = a ^ b;
 7         b = a ^ b;
 8         a= a ^ b;
 9         //方法2:加减。有弊端,两数相加之和有可能超出int的取值范围
10         /*
11         a = a + b;
12         b = a - b;
13         a = a - b;
14         */
15         System.out.println("a = "+a);
16         System.out.println("b = "+b);
17     }
18 }

    d、<< 、>>、 >>>

      <<:左移,左边最高位丢弃,右边补齐0

      >>:右移,最高位是0,左边补0,最高位是1,左边补1

      >>>:无符号右移,无论最高位是0/1,左边补齐0

 

class Test1 {
    public static void main(String[] args) {
        /*
        <<:左移,左边最高位丢弃,右边补齐0
    >>:右移,最高位是0,左边补0,最高位是1,左边补1
    >>>:无符号右移,无论最高位是0/1,左边补齐0
        */
        System.out.println("5 << 1 ="+(5 << 1)); // 10
        System.out.println("5 << 2 ="+(5 << 2)); // 20
        //向左移动几位,就是乘2的几次幂
        /*
            00000000 00000000 00000000 00000101  5的补码
         (0)00000000 00000000 00000000 00001010  10的补码(正数的反码、补码都是其本身,即10)
        (00)00000000 00000000 00000000 00101000  40的补码(正数的反码、补码都是其本身,即40)
        */
        System.out.println("12 >> 1 ="+(12 >> 1)); // 6
        System.out.println("12 >> 2 ="+(12 >> 2)); // 3
        //向右移动几位,就是除2的几次幂
        /*
              00000000 00000000 00000000 00001100   12的补码
         >>1  00000000 00000000 00000000 00000110(0) 6的补码
         >>2  00000000 00000000 00000000 00000011(00) 3的补码
        */
    }
}

 

    e、最有效率的算出5*16

      采用位移运算符<<,5<<4。

  F、三目运算符

    格式:(关系表达式)?表达式1:表达式2;

    执行流程:如果关系表达式结果为true,执行表达式1,关系表达式结果为false,执行表达式2

    代码:求两个数的最大值和三个数的最大值

class Test_Max {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
     int c = 25;
int M; M = (a < b) ? b : a;
     S = (M > c) ? M : c; System.out.println(
"最大值 = " + s); } }

 

posted on 2020-05-08 15:18  痴人谈情  阅读(296)  评论(0编辑  收藏  举报