三、运算符与流程控制

发布于 2022-02-19  137 次阅读


运算符

  • 算术运算符
  • 赋值运算符
  • 比较运算符(关系运算符)
  • 逻辑运算符
  • 位运算符
  • 三元运算符

算术运算符

image-20220218175841760

注意:

  • 取模运算的除数和被除数都可正可负,但只有被除数的符号与取模结果的符号相同,除数的符号不影响结果。
  • 除法运算若除数和被除数都是整数,则商也是整数。

三位数取十位数:a%100/10 或 a/10%10

赋值运算符

  • 当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。
  • 支持连续赋值
  • +=,-=,*=,/=号运算后不改变数值类型,例:
short a=3;

a=a+1;//编译报错

a+=1;//编译通过

比较运算符

image-20220218205236654

比较运算符的结果都是boolean型

逻辑运算符

& && | || ^
逻辑与 短路与 逻辑或 短路或 逻辑非 逻辑异或
  • Java中不可以写成3<x<6,应该写成x>3 & x<6
  • “&”和“&&”的区分:
    相同点1:&与&&的运算结果相同
    相同点2:当符号左边是true是,二者都会执行符号右边的运算
    不同点:当符号左边是false时,&继续执行符号右边的运算,&&不再继续执行右边的运算
    “|”和“||”同理,当符号左边是true时,|继续执行符号右边的运算,||不再继续执行右边的运算
  • 建议使用&&和||
    (运算都是从左到右进行的,左侧与短路运算符若能直接得出结果,则将右侧短路)

image-20220218211430011

image-20220218211653961

位运算符

image-20220218213903910

位运算是直接对整数的二进制进行的运算,运算结果仍是整数

(无符号右移用于运算哈希值)

练习:交换数值

法一:定义临时变量

int temp=num1;

num1=num2;

num2=temp;

法二:使用加减法

弊端:可能超出存储范围;只适用于数值类型(仅int以上)

num1=num1+num2;

num2=num1-num2;

num1=num1-num2;

法三:使用位运算符

弊端:只适用于数值类型

num1=num1^num2;

num2=num1^num2;

num1=num1^num2;

三目运算符

(条件表达式)?表达式1:表达式2;

条件表达式为true,运算后的结果是表达式1,为false,运算后的结果是表达式2。

既可以使用三目运算符又可以使用if-else时有限使用三目运算符,原因:简洁,执行效率高。

运算符的优先级

image-20220219115427236

如何从键盘获取不同类型的变量

  1. 导包:import java.util.Scanner;
  2. Scanner的实例化:Scanner scan = new Scanner(System.in);
  3. 调用Scanner类(文档Scanner class)的相关方法(next()/nextXxx()),来获取指定类型的变量
import java.util.Scanner;
class ScannerTest{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int num = scan.nextInt();
        System.out.println(num);
    }
}

image-20220219124526135

image-20220219124411933

对于char型的获取,Scanner没有提供相关的方法。只能获取一个字符串。

但可以使用String类的charAt方法。

System.out.println("请输入您的性别:(男/女)");
String gender = scan.next();
char genderChar = gender.charAt(0);//获取索引为0位置上的字符
System.out.println(generChar);

需要根据相应的方法来输入指定类型的值。如果输入数据与要求的类型不匹配时,会报异常:InputMisMatchException

流程控制

三种基本流程结构:顺序、选择(分支)、循环

if-else if-else

与C语言相同

switch-case

switch(表达式)中表达式的值必须是下述几种类型之一:byte,short, char,int,枚举,String;

default的位置时可选的,但在执行完所有case之后才会引出default。执行完default之后如果没有case还会接着向下执行case。(如果default在第一个,case都没有break,则从default开始跑到末尾自动结束)

for循环

for(i=0;i<5;i++);//i在循环内有效,出了循环就失效了

while与do-while循环

do-while与while循环的区别:至少会经历一次循环体

计算运行时间

获取时间戳System class——currentTimeMillis()

调用方法:

image-20220219173323601

Returns: the difference, measured in milliseconds, between the current time and midnight, January 1, 1970 UTC.

long start=System.currentTimeMillis();
long end=System.currentTimeMillis();
System.out.println("程序运行时间为:"+(end-start)+"ms");

开方

Math class——sqrt()

调用方法:

sqrt(double a) Returns the correctly rounded positive square root of a double value.

Math.sqrt(i);

break与continue

continue的用法:

for(i=0;i<10;i++){
    if(i%4==0){
        continue;
    }
    System.out.println(i);
}

break:结束当前循环,用于switch-case和循环

continue:结束当次循环,用于循环

相同点:其后不可以执行语句

标签的使用

break与continue默认操作的是当前一层for循环,若想要对指定一层for循环操作,可以在for前使用标识。

label:for(i=0;i<10;i++){
    for(j=0;j<10;j++){
        if(j%4==0){
            break label;//结束指定标识的一层for循环,continue同理
        }
    }
}

return

return:并非专门用于结束循环的,它的功能是结束一个方法。 当一个方法执行到一个return语句时,这个方法将被结束。

与break和continue不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。