0%

运算符

  • 运算符

第四章 运算符

运算符介绍

  • 运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。

    运算符有算数运算符、赋值运算符、关系运算符、逻辑运算符、位运算符和三元运算符。

★算数运算符

  • 算数运算符是对数值类型的变量进行运算的。

    运算符运算范例结果
    +正号+77
    -负号b = 11; -b-11
    +9 + 918
    -10 - 82
    *7 * 856
    /9 / 91
    %取余11 % 92
    ++自增a = 2; a++ 或 ++aa = 3
    自减a = 2; a– 或 –aa = 1
    +字符串相加“C” + “S”CS

    (注意:a++ 是先取值后运算,++a 是先运算后取值)

    ★(注意:在 Java 中,a % b = a - a / b * b;

    当 a 是小数时,a % b = a - (int) a / b * b)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Test{
    public static void main(String[] args){
    //在 Java 中,a % b = a - a / b * b
    System.out.println(10 % 3); //结果为 1 ——> 10 - 10 / 3 * 3 = 1
    System.out.println((-10) % 3); //结果为 -1 ——> -10 - (-10) / 3 * 3 = -1
    System.out.println(10 % (-3)); //结果为 1 ——> 10 - 10 / (-3) * (-3) = 1
    System.out.println((-10) % (-3)); //结果为 -1 ——> -10 - (-10) / (-3) * (-3) = -1
    System.out.println((-11) % 3); //结果为 -2 ——> -11 - (-11) / 3 * 3 = -2
    }
    }

    ★经典面试题:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Test{
    public static void main(String[] args){
    int i = 1;
    i = i++ ; //规则:使用临时变量。(1) temp = i(这里的i是等号右边的i);(2) i = i + 1;(3) i = temp(这里的i是等号左边的i)。
    System.out.println(i); //结果为 1

    int j = 1;
    j = ++j ; //规则:使用临时变量。(1) j = j + 1;(2) temp = j(这里的j是等号右边的j);(3) j = temp(这里的j是等号左边的j)。
    System.out.println(j); //结果为 2
    }
    }

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

运算符运算范例结果
==相等于8 == 7false
!=不等于8 != 7true
<小于8 < 7false
>大于8 > 7true
<=小于等于8 <= 7false
>=大于等于8 >= 7true
instanceof判断对象的运行类型是否为XX类型或XX类型的子类型“Alex” instanceof Stringtrue
1
2
3
4
// Sub 是 Base 的子类
Base base = new Sub();
System.out.println(base instanceof Base); //true
System.out.println(base instanceof Sub); //true,因为运行类型是 Sub
  • 注意子类对象 instanceof 父类 == true

    父类对象 instanceof 子类 == false

逻辑运算符

  • 用于连接多个关系表达式,最终结果是一个 boolean 类型的值,即 true 或 false。
  1. 短路与 &&、短路或 ||和取反 !
    • 短路与 && :两个条件都为 true ,结果才为 true;
    • 短路或 ||:两个条件只要有一个为 true,结果就是 true;
    • 取反 !:如果条件本身成立,则结果为 false,否则为 true。
  2. 逻辑与&、逻辑或|、逻辑异或 ^
    • 逻辑与 &:两个条件都为 true ,结果才为 true;
    • 逻辑或 |:两个条件只要有一个为 true,结果就是 true;
    • 逻辑异或 ^ :a ^ b ,当 a 和 b 不同时,结果为 true ,否则为 false。 (4 < 1) ^ (2 > 1) ——> true

▲(注意:&& 与 & 的区别:对 && 而言,如果第一个条件为 false ,则第二个条件不会判断,最终结果为 false,效率高;

对 & 而言,不管第一个条件是否为 false ,第二个条件都要判断,效率低 。开发中基本用 &&)

▲(注意:|| 与 | 的区别:对 || 而言,如果第一个条件为 true ,则第二个条件不会判断,最终结果为 true,效率高;

对 | 而言,不管第一个条件是否为 true ,第二个条件都要判断,效率低 。开发中基本用 ||)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Test{
public static void main(String[] args){
int a = 1 ;
int b = 2;
if(a < 0 && ++b > 1){
System.out.println("true");
}else{
System.out.println("false");
}
System.out.println("a = " + a +" " + "b = " + b);
/* 输出结果为 false
a = 1 b = 2
因为当判断 a < 0 为 false 之后,++b > 1 就不再判断了,所以 b 的值为 2
*/
}
}

赋值运算符

  • 赋值运算符就是将某个运算后的值,赋给指定的变量。

    • 基本赋值运算符:=
    • 复合赋值运算符:+=、-=、*=、/=、%=
  • 赋值运算符特点

    1. 运算顺序从右往左;

    2. 赋值运算符的左边只能是变量,右边可以是变量、表达式、常量值;

    3. 复合赋值运算符等价于下面的效果:a += 1 + 2 ——> a = a + (1 + 2)

    4. 复合赋值运算符会进行类型转换byte b = 2; b += 3; b++; ——> 此时 b = 6 ,且为 byte类型

      ★(注意:b += 3,其实等价于 b = (byte)(b + 3),底层会对这个结果进行强转的,所以它编译的时候没事,但是如果是

      b = b + 3,则会编译错误,因为 3 默认是 int 型,相当于结果是 int 类型,赋给 byte 类型变量会报错)

三目运算符

  • 基本语法:条件表达式 ? 表达式1 : 表达式2

    如果条件表达式结果为 true ,则运算表达式1,反之运算表达式2。

  • 使用细节

    1. 表达式1 和表达式2 要为可以赋给接收变量的类型(或可以自动转换);

    2. 三目运算符可以转为 if - else 语句。

    3. 三目运算符是一个整体,要求表达式1和表达式2类型一致,所以最后的结果类型会自动升到精度最高的那种类型。

      1
      2
      3
      4
      5
      6
      public class Test {
      public static void main(String[] args) {
      Object obj1 = true ? new Integer(1) : new Double(2);
      System.out.println(obj1); //输出结果为 1.0
      }
      }

运算符优先级

  1. 只有单目运算符、赋值运算符是从右向左运算的;
  2. ()、{}、. 、, 等 —> 单目运算符 —> 算数运算符 —> 位移运算符 —> 比较运算符 —> 逻辑运算符 —> 三目运算符 —> 赋值运算符。

★标识符的命名规则和规范

  • 规则

    1. 由 26 个英文字母大小写,0-9,_ 或 $ 组成;
    2. 数字不可以开头;
    3. 不可以使用关键字和保留字,但能包含关键字和保留字;
    4. 严格区分大小写;
    5. 标识符不能包含空格。
  • 规范

    1. 包名:多单词组成时所有字母都小写:aaa.bbb.ccc ;
    2. 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz; —> 大驼峰命名方式
    3. 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz;—> (小)驼峰命名方式
    4. 常量名:所有字母都大写,多单词时每个单词用下划线连接:XXX_YYY_ZZZ。

进制

  1. 二进制:0,1。满 2 进 1,以 0b 或 0B 开头:0b1010 —> 10;
  2. 十进制:0 - 9。满 10 进 1。
  3. 八进制:0 - 7。满 8 进 1,以数字 0 开头表示:010 —> 8;
  4. 十六进制:0 - 9 及 ABCDEF(此处的 A - F 不区分大小写),满16进1,以 0x 或 0X 开头:0x1010 —> 4112。

位运算符

运算符含义
按位与 &两个全为 1 ,结果为 1 ,否则为 0
按位或 |两个有一个为 1 ,结果为 1 ,否则为 0
按位异或 ^两个一个为 1 ,一个为 0,结果为 1 ,否则为 0
按位取反 ~0 -> 1,1 -> 0
算数右移 >>低位溢出,符号位不变,并用符号位补溢出的高位
算术左移 <<符号位不变,低位补0
逻辑右移 >>>低位溢出,高位补0

(★注意:在计算机进行位运算的时候,都是以补码的方式来运算的!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Test{
public static void main(String[] args){
System.out.println( ~ -2 ); //结果为 1
/* 运算步骤如下:
(1) 先求出 -2 的补码:
原码:10000000 00000000 00000000 00000010
补码:11111111 11111111 11111111 11111110
(2) 进行取反运算(位运算是以补码的方式来运算的)
取反后的补码:00000000 00000000 00000000 00000001
(3) 将运算后的补码转变为原码(看最终结果要看原码)
补码转变为原码:00000000 00000000 00000000 00000001
所以最终结果为 1
*/
}
}
---------------The End---------------