03 运算符

126 阅读4分钟

01 算术运算符的概念和使用

算术运算符有以下五种:

  • +表示加法运算符
  • -表示减法运算符
  • *表示乘法运算符
  • /表示除法运算符
  • %表示取模运算符

使用算术运算符时要注意以下几点:

  • 两个整数相除结果只保留整数部分,丢弃小数部分
  • 如果想保留小数部分,有两种方式:第一种是使用强制类型转换将其中一个操作数转换为double类型在进行运算;第二种是将其中一个操作数乘以1.0(更加推荐使用此方法)
  • 0是不能作为除数

02 算术运算符练习

要求:提示用户输入正整数类型的秒数,拆分秒数后输出x小时x分x秒

代码实现

import java.util.Scanner;

public class TimeTest {
    public static void main(String[] args) {
        System.out.println("请输入一个正整数的秒数:");
        Scanner sc=new Scanner(System.in);
        int time=sc.nextInt();
        int hour=time/3600;
        int min=time%3600/60;
        int sec=time%60;
        System.out.println(time+"转换为"+hour+"小时"+min+"分"+sec+"秒");
    }
}

03 字符串连接符

+可以实现字符串的连接。同时可以实现字符串与其他数据类型”相连“

注意:+既可以作为字符串连接符,又可以作为加法运算符,两者的区别是:只要+两边的操作数中有一个操作数是字符串类型,那么+作为字符串连接符,否则作为加法运算符

int a=5;
int b=6;
int c=7;
System.out.println(a+b+c);//18
System.out.println(""+a+b+c);//567
System.out.println(a+""+b+c);//567
System.out.println(a+b+""+c);//117
System.out.println(a+b+c+"");//18

04 关系运算符

关系运算符有六种:

  • >表示是否大于运算符 >=表示是否大于等于运算符

  • <表示是否小于运算符 <=表示是否小于等于运算符

  • ==表示是否等于运算符 !=表示是否不等于运算符

所有关系运算符作为最终运算的结果一定是boolean类型

05 自增自减运算符

  • ++表示自增运算符,用于使得当前变量自身的数值加1的效果
  • --表示自减运算符,用于使得当前变量自身的数值减1的效果

注意自增自减运算符只能用于变量,不能用于常量

int a=6;
System.out.println(a++);//6
System.out.println("a="+a);//7
System.out.println(++a);//8
System.out.println("a="+a);//8

自增自减运算符可以放在变量的前面和后面,两者之间的区别是:放在前面,则先对变量的数值做自增或自减,再将变量的数值作为表达式的结果;放在后面,先将变量的数值作为表达式的结果,再对变量的数值进行自增或自减。

06 自增自减运算符笔试考点

根据代码写结果:

int a=10;
int b=a++;
System.out.println("b="+b);
System.out.println("a="+a);
int c=++a;
System.out.println("c="+c);
System.out.println("a="+a);
System.out.println(a++ + ++a);
System.out.println("a="+a);

对应的输出结果是:

b=10;
a=11;
c=12;
a=12;
26;
a=14

07 逻辑运算符

逻辑运算符有三种:

  • &&表示逻辑与运算符,相当于“并且”,同真为真,一假为假

  • ||表示逻辑或运算符,相当于“或者”,一真为真,同假为假

  • !表示逻辑非运算符,相当于“取反”,真变假,假变真 逻辑运算符的操作数都是boolean表达式

08 逻辑运算符的短路特性

  • 对于逻辑与运算符来说,只要第一个表达式为假,直接跳过第二个表达式,整个表达式结果为假

  • 对于逻辑或运算符来说,只要第一个表达式为真,直接跳过第二个表达式,整个表达式结果为真

int a=1;
int b=2;
boolean c=(++a==1)&&(++b==2);
System.out.println("c="+c);//false
System.out.println("a="+a);//a=2
System.out.println("b="+b);//b=2
boolean d=(++a==3)||(++b==3);
System.out.println("d="+d);//true
System.out.println("a="+a);//a=3
System.out.println("b="+b);//b=2


09 三目运算符

语法格式 条件表达式?表达式1:表达式2

判断条件表达式是否成立,成立就执行表达式1,否则执行表达式2

练习:提示用户输入两个数,使用三目运算符找到最大值并打印出来

import java.util.Scanner;

public class ThreeEyeTest {
    public static void main(String[] args) {
        System.out.println("请输入两个正整数:");
        Scanner sc=new Scanner(System.in);
        int a=sc.nextInt();
        int b=sc.nextInt();
        System.out.println("最大数为:"+(a>b?a:b));
    }
}

10 赋值运算符

=表示赋值运算符,将=右边的数值赋值给=左边的变量,覆盖变量原来的值

赋值表达式本身也有值,其本身的值就是所赋之值

除了上面简单的赋值运算符,还有复合赋值运算符 +=、*=、/=、-=等这些。

11 赋值运算符笔试考点

  1. 判断以下代码是否正确

    byte a=10;
    a=a+6;
    

答:上面代码第二行会报错:不兼容的类型,从int转换到byte可能会有损失。

出现这个错误的原因,是编译器对byet类型的运算进行了优化导致的,由于byte类型的范围比较小,进行运算很容易造成溢出,所以编译器会将byte类型的操作数转化为int类型,再进行运算,这就导致byte+int和byte+byte类型相加的结果都是int类型。

需要注意的是将第二行写成a+=6则不会报错,这是因为a=a+6和a+=6从结果上来看是等价的,但是本质上a+=6多了一个强制类型转换的操作,即a+=6等价于a=(byte)a+6,这也正是a+=6不会报错的原因

  1. 编程规范问题

    a==2;//表示判断变量a的数值是否等于2
    2==a;//判断2是否等于变量a的数值,从结果上来看与上面相同,但更推荐此种方式
    a=2;//将2的值赋值给变量a,并覆盖a原来的值
    2=a;//编译报错
    

    2==a这种写法更容易规避漏掉一个=的错误,实际开发推荐这种方式

12 移位运算符

<< 左移运算符,用于将数据的二进制位向左移动,右边用0补充

>>右移运算符,用于将数据的二进制位向右移动,左边使用符号位补充

>>>逻辑右移运算符,将数据的二进制位向右移动,左边使用0补充

13 位运算符

& 表示按位与运算符,按照二进制位进行与运算,同1为1,一0为0

|表示按位或运算符,按照二进制位进行或运算,一1为1,同0为0

~表示取反运算符,按照二进制位进行取反,1变0, 0变1

^表示异或运算符,按照二进制位进行异或,同为0,异为1

14 运算符的优先级

  • ()的优先级很高
  • = 的优先级很低
  • 无法确认优先级时,可以使用()来确保