第四章、运算符

        运算符指明对操作数的运算方式。组成表达式的Java操作符有很多种。它是一种特殊的符号,用以表示数据的运算、赋值和比较等,在Java中的数据都是通过运算符来操作的

运算符按照功能分为:算术运算符、赋值运算符、比较(或关系)运算符、逻辑运算符,位运算符、条件运算符

按照操作数个数分为:

  • 一元运算符(单目运算符):包括 正号(+) 、 负号( -) 、自增(++) 、自减(--)、 非(!) 、 取反(~)
  • 二元运算符(双目运算符): 除了一元和三元运算符剩下的都是二元运算符
  • 三元运算符(三目运算符):条件表达式?结果A:结果B

本章将对java各类型的运算符进行分类阐述

一、算术运算符

Java基本算术运算符包括7个,它与其他大多数程序设计语言相同,包括加(+)、减(-)、乘(*)、除(/)、取余(%)、正号(+)、负号(-)、自增(++)、(自减)--

1、常规应用

        加、减、乘、除、取余、正号、负号

public class ArithmeticTest0 {
    public static void main(String[] args) {
        int a = 15;
        int b = 10;
        System.out.println("两数相加:"+ (a+b));
        System.out.println("两数相减:"+ (a-b));
        System.out.println("两数相乘:"+ (a*b));
        System.out.println("两数相除:"+a/b);
        System.out.println("两数取余:"+a%b);
        System.out.println("正号:"+(+a));
        System.out.println("负号:"+(-b));
    }
}

  运行结果:

两数相加:25
两数相减:5
两数相乘:150
两数相除:1
两数取余:5
正号:15
负号:-10
 2、针对加号的两种用法
  • 对于+两边都是数值的话,+就是加法的意思
  • 对于+两边至少有一边是字符串的话,+就是拼接的意
public class ArithmeticTest {
    public static void main(String[] args) {
        String  str = "Hello";
        System.out.println(str+ "World");//表示将两个字符串进行拼接
        System.out.println(str+ 5 + 20); // Java520
    }
}

运行结果

HelloWorld
Hello520
3、自增、自减

      ++运算,表示自增1。同理,-- 运算,表示自减1

  • 单独使用 :变量在单独运算的时候,变量前++和变量后++,所得结果没有区别
public class ArithmeticTest {
    public static void main(String[] args) {
        int a = 3;
        System.out.println("变量前++:"+(++a));
        System.out.println("变量后++:"+(a++));//a++不会自增,直接输出++a后的值
    }
}

运行结果

a变量前++:4
a变量后++:4
  • 复合使用 : 和其他变量放在一起使用或者和输出语句放在一起使用,前++和后++将会不同。

        变量前++ :变量先自增 1,然后再运算

        变量后++ :变量先运算,然后再自增 1

public class ArithmeticTest{
    public static void main(String[] args) {
        int x = 3;
        int y = 4;
        //++x后x的的值变为 4 ,再加y的值,所以最终相加的结果位:8
        System.out.println("变量前++:"+(++x + y));
        x = 3;
        //x的值为3,再加y的值为4,所以最终相加的结果位:7 y++不会自增1
        System.out.println("变量后++:"+ (x + y++));
        //由于在(x+y++) y运算后自增了1,所以此时y的值变为:5
        System.out.println("运算后y的值:"+ y);
    }
}

运行结果:

变量前++:8
变量后++:7
运算后y的值:5

二、赋值运算符

 1、符号:=

  • 当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理
  • 支持连续赋值
public class SetValueTest {
    public static void main(String[] args) {
        int i = 10;
        long k = i; //将i=10赋值给变量k,自动类型转换(变量k的数据类型取值范围比int大)
        byte h = (byte)i;//将i赋值给h强制类型转换 (变量h的数据类型取值范围比int小大)

        int j , q;
        j = q = 20; //连续赋值语法
    }
}
  • 赋值运算符的几种扩展用法 : +=、 -=、*=、 /=、%=

运算符

说明

+=

将符号左边的值和右边的值进行相加操作,最后将结果赋值给左边的变量

-=

将符号左边的值和右边的值进行相减操作,最后将结果赋值给左边的变量

*=

将符号左边的值和右边的值进行相乘操作,最后将结果赋值给左边的变量

/=

将符号左边的值和右边的值进行相除操作,最后将结果赋值给左边的变量

%=

将符号左边的值和右边的值进行取余操作,最后将结果赋值给左边的变量

示例如下:

public class SetValueTest2 {
    public static void main(String[] args) {
        //举例说明+= -= *= /= %=
        int i = 10;
        i += 5; //其计算方式: i = i+ 5
        System.out.println("i+=后的结果:" +i);//其计算结果为:15

        int j = 10;
        j -=2;
        System.out.println("j-=后的结果:" +j);//其计算结果为:8

        int k = 10;
        k *= 10;
        System.out.println("k*=后的结果:" +k);//其计算结果为:100

        int l = 10;
        l /= 2;
        System.out.println("l/=后的结果:" +l);//其计算结果为:5

        int m = 20;
        m %=7;
        System.out.println("m%=后的结果:" +m);//其计算结果为:6
    }
}

运行结果:

i+=后的结果:15
j-=后的结果:8
k*=后的结果:100
l/=后的结果:5
m%=后的结果:6

三、关系(比较)运算符

    关系运算符包括大于 (>) 、 小于(<) 、等于(==)、大于或等于(>=)、小于或等于(<=)、不等于(!=)

  • 关系运算符所获得的结果是一个布尔(boolean)值,它们计算的是操作数之间的关系;若关系的真,则结果为true,若关系不为真,则结果为false
public class CompareTest {
    public static void main(String[] args) {
        int i = 10;
        int j = 20;
        System.out.println("变量i大于j:"+(i>j));//结果为:false
        System.out.println("变量i小于j:"+(i= j));//结果为:false
        System.out.println("变量i小于等于j:"+ (i <= j));//结果为:true
    }
}

运行结果:

变量i大于j:false
变量i小于j:true
变量i等于j:false
变量i不等于j:true
变量i不等于j:false
变量i不等于j:true
  • 关系运算符中等于(==)和不等于(!=)适用于所有的基本数据类类型,同时也适用于所有对象。在进行对象比较时,其比较的是对象的引用,而不是对象的内容,示例如下:

public class CompareEquivalence {
    public static void main(String[] args) {
        Integer i = new Integer(47);
        Integer k = new Integer(47);

        System.out.println("对象i等于k:"+(i==k));
        System.out.println("对象i不等于k:"+(i!=k));
    }
}

       根据常规逻辑:第一条输出语句输出的结果应该为 true,第二条语句输出的结果应该为 false,因为两个对象的值都是相同的(47),但事实不是这样的。输出结果如下运行结果:

对象i等于k:false
对象i不等于k:true

        虽然两个对象的内容一样,都是47,但这两个对象的引用是不一样的,所以等于(==)和不等于(!=)在比较两个对象时,比较的是两个对象的引用,而不是对象的内容。

在java中要比较两个对象的内容是否相同,使用equals()方法进行,具体的用法在后续的章节中阐述。

四、逻辑运算符

逻辑运算符,操作的都是 boolean 类型的变量或常量,用于连接多个条件(多个关系表达式),最终的结果也是一个 boolean类型值

短路与(&&), 短路或(||)、取反(!) 逻辑与(&)、逻辑或(|)、 逻辑异或(^)

  • & 和 &&:都表示"且"关系,当符号左右两边布尔值都是 true 时,结果才能 为 true。否则,为 false。
  • | 和 || :都表示"或"关系,当符号两边布尔值有一边为 true 时,结果为 true。当两边都为 false 时,结果为 false
  • ! :表示"非"关系,当变量布尔值为 true 时,结果为 false。当变量布尔值 为 false 时,结果为 true。
  • ^ :当符号左右两边布尔值不同时,结果为 true。当两边布尔值相同时, 结果为 false

其基本规则如图:

第四章、运算符_第1张图片

     & 和 &&比较:

  •  相同点:如果符号左边是 true,则二者都执行符号右边的操作
  • 不同点:& : 如果符号左边是 false,则继续执行符号右边的操作

        && :如果符号左边是 false,则不再继续执行符号右边的操作

        在实际开发中,推荐使用 &&

      | 和 ||:

  • 相同点:如果符号左边是 false,则二者都执行符号右边的操作
  • 不同点:| : 如果符号左边是 true,则继续执行符号右边的操作

        || :如果符号左边是 true,则不再继续执行符号右边的操作

        在实际开发中,推荐使用 ||

五、位运算符

在java中位运算符包括以下7个:

位右移(>>)、位左移(<<) 、无符号右移(>>>)、按位与(&)、按位或(|)、按位异或(^)、按位取反(~)

位运算符的运算过程都是基于二进制的补码运算,各运算符发运算规则如下:

  • 位右移(>>): 在一定范围内,数据每向右移动一位,相当于原数据/2
  • 位左移(<<) : 在一定范围内,数据每向左移动一位,相当于原数据*2
  • 无符号右移(>>>): 往右移动后,左边空出来的位直接补 0
  • 按位与(&): 对应位都是 1 才为 1,否则为 0

        1 & 1 结果为 1

        1 & 0 结果为 0        

        0 & 1 结果为 0

        0 & 0 结果为 0

  • 按位或(|): 对应位只要有 1 即为 1,否则为 0

        1 | 1 结果为 1

        1 | 0 结果为 1

        0 | 1 结果为 1

        0 |0 结果为 0

  • 按位异或(^): 对应位一个为1 一个为0,才为1,否则为0

        1 ^ 1 结果为 0

        1 ^ 0 结果为 1

        0 ^ 1 结果为 1

        0 ^ 0 结果为 0

  • 按位取反(~): 对应位为1,则结果为0;对应位为0,则结果为1,

        ~0 就是 1

        ~1 就是 0

六、条件运算符

符号 : ?:

语法格式: (条件表达式)? 表达式a:表达式b ,

解释: 条件表达式是 boolean 类型的结果,根据 boolean 的值选择表达式a 或表达式b

第四章、运算符_第2张图片

示例如下:

/**
 * 获取三个数中的最大值
 */
public class ConditionExer {
    public static void main(String[] args) {
        int i = 43;
        int j = 33;
        int k = 73;
        int tempMax = (i > j)? i:j;
        int finalMax = (tempMax > k)? tempMax : k;
        System.out.println("三个数中最大值为:" + finalMax);

    }
}

运行结果:

三个数中最大值为:73

七、运算符优先级

运算符有不同的优先级,所谓优先级就是在表达式运算中的运算符顺序 ,当一个表达式中存在多个操作符时,操作符的优先级就觉得了各部分的计算顺序

优先级

运算符说明

运算符

1

括号

()、[]、{}

2

正负号

+、-

3

单元运算符

++、--、~、!

4

乘法、除法、求余

*、/、%

5

加法、减法

+、-

6

移位运算符

<<、>>、>>>

7

关系运算符

<、<=、>=、>

8

等价运算符

==、!=

9

按位与

&

10

按位异或

^

11

按位或

|

12

条件与

&&

13

条件或

||

14

三元运算符

? :

15

赋值运算符

=、+=、-=、*=、/=、%=

16

位赋值运算符

&=、|=、<<=、>>=、>>>=

你可能感兴趣的:(重学JavaSE,j2se,开发语言,java)