运算符

56 阅读4分钟

计算机的基本用途就是执行数学运算,Java提供了一套丰富的运算符来操作变量。

image.png

算数运算符

  • +,-,*,/,%属于二元运算符,%属于取模运算符。
  • 自增运算符++,自减运算符--属于一元运算符

二元运算符的运算规则:

整数运算

  • 如果两个操作数有一个为long,则结果也是long类型;
  • 没有long类型时,结果为int。即使操作数全部都为short,byte,结果也是int;

浮点运算

  • 如果两个操作数有一个是double,则结果为double。
  • 只有两个操作数都是float,结果都为float;

取模运算

  • 其操作数可以是浮点数,一般使用整数,结果是‘余数’,‘余数’符号和左边操作数一致,如:7%3=1;-7%3=-1;7%-3=1;
public class TestOperator01 {
  public static void main(String[] args) {
    int a = 3;
    int b = 4;
    // long b = 4; 
    int c = a + b; // 假如b是long类型,a + b属于long类型,则int c 会报错:不兼容的类型,long不可以赋值给int类型
    System.out.println(c);

    double d = 3 + 3.14;
    int d2 = 32/3; // 10, int类型则直接保留整数部分,直接去除小数部分,没有四舍五入;
    System.out.println(d2);
    double d3 = 32.0/3;
    System.out.println(d3);// 10.66666666

    // 取余数
    int e = 10 % 3; // 1, 取余操作。结果符号和左边操作数相同
    System.out.println(e); 

    // 测试自增自减
    int g = 30;
    g++; // 相当于 g = g + 1;
    g--; // 相当于 g = g - 1;

    g = 10;
    int h = g++; // 先赋值,后自增
    g = 10;
    int i = ++g; // ++g先自增,后赋值

    System.out.println(h); // 10;
    System.out.println(i); // 11
  }
}

赋值及其扩展赋值运算符

image.png

public class TestOperator2 {
  public static void main (String[] args) {
     int a = 3;
     int b = 4;
     a += b; // 相当于 a = a + b;
     System.out.println(a); // 7

     a = 3;
     a *= b + 3; // 相当于 a = a*(b+3)
     System.out.println(a); // 21
  }
}

关系运算符

关系运算符用来进行比较运算,关系运算符的结果是布尔值 true/false;

image.png

  • = 是赋值运算符,而真正的判断两个操作数是否相等的运算符是==;
  • ==、!= 是所有(基本和引用)数据类型都可以使用
  • 、>=、<、<= 仅针对数值类型(byte/short/int/long, float/double)以及char

public class TestOperator3 {
  public static void main(String[] args) {
    int a = 3;
    int b = 4;
    boolean c = a > b;
    System.out.println(c);

    char d = 'h';
    // char 值位于0~65536之间,可以通过int强制转型为数字
    System.out.println((int)d);
    boolean e = d > 100;
    System.out.println(e);
  }
}

逻辑运算符

逻辑运算的操作数和结果都是boolean值

image.png

其中短路与 和 与 的不同点在于:

与:对于左右条件都会去执行; 短路与:左侧条件如果为false了,则不再执行右侧条件

public class TestOperator4 {
   public static void main(String[] args) {
     boolean b1 = true;
     boolean b2 = false;
     System.out.println(b1 & b2); // false
     System.out.println(b1 | b2); // true
     System.out.println(!b1); // false
     System.out.println(b1 ^ b2); // true

     // 短路与、短路或
     boolean b3 = 1 > 2 && (4 < 3/0);
     System.out.println(b3); // false; 1 > 2 得到false的情况下,不再执行计算(4 < 3/0),即使0不能作为分母
     boolean b4 = 1 < 2 && 3 < 2;
     System.err.println(b4); // false, 1 < 2为 true,则也会继续执行后面的 3 < 2,为false;
     boolean b5 = 1 > 2 & (4 < 3/0);
     System.out.println(b5); // 报错,& 左右两侧都会执行
   }
}

位运算

位运算指的是二进制位的运算

image.png

注意:& 和 | 既是逻辑运算符,又是位运算符。如果左右两侧是boolean类型,则作为逻辑运算符,如果左右两侧是整数类型,则是位运算;

public class TestOperator5 {
  public static void main (String[] args) {
    int a = 7;
    int b = 8;
    System.out.println(a & b); //0, 7 的二进制是 0111, 8的二进制1000   最终得到 0000;
    System.out.println(a | b); // 15;  7 的二进制是 0111, 8的二进制1000   最终得到 1111, 则是15
    System.out.println(a ^ b); // 15; 7 的二进制是 0111, 8的二进制1000;相同为0,不同为1,则也是1111,表示15
    System.out.println(~b); // -9;

    // 移位
    int c = 5 << 1;// 左移运算符,左移一位相当于乘以2;5 * 2
    System.out.println(c); // 10;
    int e = 5 << 2; // 5*2*2;
    System.out.println(e); // 20;
    int f = 40 >> 3;
    System.out.println(f); // 40/8 = 5
  }
}

字符串连接符

+左右两侧的操作数只要有一个是字符串类型,系统会自动将另一个操作数转换为字符串再进行连接。

public class TestOperator6 {
  public static void main(String[] args) {
    String a = "3";
    int b = 4;
    System.out.println(a+b); // "34"

    // 条件是String字符串,不是char.若是char,则仍然是加法;
    char c1 = 'h';
    char c2 = 'i';
    System.out.println(c1+c2);  // 209, 这时候还是加法运算
    // 通过加空字符串,让+都变成连接符
    System.out.println("" + c1 + c2); // "hi"
  }
}

条件运算符

public class TestOperator6 {
  public static void main(String[] args) {
    int score = 60;
    String type = score < 60 ? "不及格" : "及格";
    System.out.println(type); // 及格
  }
}

运算符优先级

image.png

  • 无需刻意记这些优先级,表达式里面优先用()来组织;
  • 逻辑与、逻辑或、逻辑非得优先级:逻辑非 > 逻辑与 > 逻辑或;
public class TestOperator6 {
  public static void main(String[] args) {
    boolean s1 = true, s2 = true, s3 = false;
    System.out.println(s1 || s2 && s3); // true;  非 > 与  > 或; s1 || (s2 && s3) 
  }
}