运算符,分支结构
目录
运算符,分支结构
1. 运算符
1.1 算术运算符
数学:
+ - × ÷ () =
要求:
1. 先乘除后加减
2. 有括号先处理括号内容
3. 0 不能作为除数
4. 从左至右执行
开发中使用的算术运算符:
+ - * / % () =
% 取余
5 ÷ 2 = 2 ... 1 ==> 5 % 2 = 1
// 算术运算符演示
class Demo1 {
public static void main(String[] args) {
// 定义两个 int 类型变量
int num1 = 10;
int num2 = 20;
/*
注意事项:
1. 在代码运行过程中,变量存储数据内容有可能会随着代码执行发生改变。
2. 变量存储数据有且只能是在被赋值的情况下才可以改变,未赋值不变
*/
num1 = num1 + num2; // num1 = 30 num2 = 20
num1 = num1 * num2; // num1 = 600 num2 = 20
num1 = num1 - num2; // num1 = 580 num2 = 20;
num1 = num1 / num2; // num1 = 29 num2 = 20;
num1 = num1 % num2; // num1 = 9 num2 = 20;
System.out.println(num1);
System.out.println(num2);
}
}
1.2 增强版运算符
+= -= *= %= /=
案例:
int num1 = 10;
int num2 = 20;
num1 = num1 + num2; ==> num1 += num2;
优势:
1. 减少变量书写,避免错误!!!
2. 带有一定的特殊功能,包含隐含类型转换!!!
1.3 自增自减运算符
【建议】
1. 自增自减充满了歧义性,开发中尽量减少自增自减运算符使用。
2. 推荐使用 += 1 和 -= 1 替代自增自减运算符。
3. 自增自减运算符操作单独成行
【语法要求】
1. 自增自减运算符有且只可以操作【变量】
2. 自增自减运算符在变量之前或者变量之后有不同的效果。
【语法效果】
1. 自增自减运算符在变量之后,首先取值变量保存数据内容,参与当前行代码执行,再来执行自增自减操作
2. 自增自减运算符在变量之前,首先执行自增自减操作,对变量数据进行修改,再取值变量保存数据内容,参与当前行代
码执行。
// 面试题1
int num = 5;
int ret = num++ * ++num;
num = ? 7
ret = ? 35
/*
num++ 首先取值 num 数据参与表达式运算 取值内容为 5
num自增操作 ==> 6
++num 首先自增操作,num ==> 7
取值num存储结果参与表达式运算 7
ret = 5 * 7 ==>35
*/
// 面试题2
int num = 5;
++(num++)++;
num = ERROR 【语法错误】
/*
分析问题:
1. 自增自减运算符有且只可以操作【变量】
2. ()里面的内容是一个整体,可以认为是一个【常量】
语法冲突!!!报错!!!
*/
1.4 关系运算符
格式:
> < >= <= == !=
对外数据形式:
boolean true or false
关系运算符两边的数据结果满足关系运算符所需,结果为 true,否则为 false
// 关系运算符
class Demo3 {
public static void main(String[] args) {
boolean ret = 5 > 3;
System.out.println(ret); // true
ret = 5 < 3;
System.out.println(ret); // false
ret = 5 >= 5;
System.out.println(ret); // true
ret = 5 <= 15;
System.out.println(ret); // true
ret = 5 != 15;
System.out.println(ret); // true
ret = 5 == 15;
System.out.println(ret); // false
}
}
1.5 逻辑运算符
&& 与
同真为真,有假【即】假
|| 或
有真【即】真,同假为假
! 非 犟 取反
真变假,假变真
// 逻辑运算符
class Demo4 {
public static void main(String[] args) {
boolean ret = 10 > 5 && 5 > 1;
System.out.println(ret); // true
ret = 10 > 5 && 1 > 5;
System.out.println(ret); // false
ret = 10 > 5 || 1 > 5;
System.out.println(ret); // true
ret = 10 < 5 || 1 > 5;
System.out.println(ret); // false
ret = !(5 > 5);
System.out.println(ret); // true
ret = !(5 == 5);
System.out.println(ret); // false
}
}
1.6 逻辑运算符短路原则
后期可以利用逻辑运算符短路原则,进行条件排列,提高开发效率,提高运行效率
int num = 10;
boolean ret = 10 > 50 && ++num > 5;
ret = false;
num = 10;
/*
逻辑与 同真为真,有假【即】假
逻辑与短路原则:
逻辑与表达式,出现 false 条件,整个表达式结果已明确为 false,计算机为了提高效率,从 false 条件开始,之后的表达式不再执行。
*/
int num = 10;
boolean ret = 10 > 5 || ++num > 5;
ret = true;
num = 10;
/*
逻辑或 有真【即】真,同假为假
逻辑或短路原则:
逻辑或表达式,出现 true 条件,整个表达式结果已明确为 true,计算机为了提高效率,从 true 条件开始,之后的表达式不再执行。
*/
1.7 运算符练习题
1. 完成判断是否为大写字母条件
// 'A' <= ch <= 'Z' 开发中不可以使用!!!
char ch = 'B';
ch >= 'A' && ch <= 'Z';
2. 完成判断是否为小写字母条件
char ch = 'g';
ch >= 'a' && ch <= 'z';
3. 完成判断是否为英文字母条件
char ch = 'A';
ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z'
正确 逻辑与运算符优先级高于逻辑或
(ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')
正确 小括号可以将条件看作是一个整体,同时优先运行
4. 完成判断是否为数字字符条件
char ch = '3';
ch >= '0' && ch <= '9';
5. 完成判断一个年份是否为 闰年
/*
1. 可以被 4 整除,但是不可以被 100 整除
2. 可以被 400 整除
year % 4 == 0
year % 100 != 0
year % 400 == 0
*/
int year = 2008;
year % 4 == 0 && year % 100 != 0 || year % 400 == 0
2. 分支结构
2.1 生活中案例
游戏 Rank 分
1000 <= Rank <= 1200 黄铜
1200 < Rank <= 1400 白银
1400 < Rank <= 1600 黄金
1600 < Rank <= 1800 铂金
1800 < Rank <= 2000 钻石
2000 < Rank <= 2200 大师
2200 < Rank 王者
购物 VIP 等级
100 <= money < 500 铁牌会员
500 <= money < 1000 铜牌会员
1000 <= money < 5000 银牌会员
5000 <= money < 20000 金牌会员
20000 <= money 黑钻会员
2.2 if 分支
// 格式:
if (/* 条件判断 boolean true or false */) {
// if 之后为 true 执行大括号内容
}
/*
执行流程:
当前程序执行到 if 分支结构,首先判断 if 之后的条件是否为 true,如果为 true 执行大括号中的代码内容,如果为 false 跳过分支结构,执行之后的代码
*/
// if 分支结构
class Demo5 {
public static void main(String[] args) {
// int num = 1;
boolean flag = false;
// if (num > 5) {
if (flag) {
System.out.println("我想吃擀面皮");
}
System.out.println("螺洲螺蛳粉+臭豆腐+鲱鱼罐头");
}
}
2.3 if else 分支
// 格式
if (/* 条件判断 boolean true or false */) {
// true 语句体
} else {
// false 语句体
}
/*
执行流程:
当前程序运行到 if else 分支结构,首先判断 if 之后小括号里面的内容是否为 true,如果为 true 执行 true 语句体,如果为 false 执行 false 语句体
*/
// if else 分支结构
class Demo6 {
public static void main(String[] args) {
boolean flag = false;
if (flag) {
System.out.println("郑州公交车 YYDS");
} else {
System.out.println("武汉公交表示不服");
}
}
}
2.4 if else-if 分支
// 格式
if (/* 条件匹配 1 */) {
// 处理方式 1
} else if (/* 条件匹配 2 */) {
// 处理方式 2
} else if (/* 条件匹配 3 */) {
// 处理方式 3
} else {
// 无条件匹配的最终处理方式
}
/*
执行流程:
当前程序运行到 if else-if 结构,匹配 if 之后的条件,如果有匹配项,执行对应处理方式,如果没有任何一个条件匹配,执行 else 中的最终处理方式
学生成绩:
100制
90以上 秀儿
80以上 良儿
70以上 中儿
60以上 过儿
60以下 让你爹穿着拖鞋来学校一趟
*/
// if else-if
class Demo7 {
public static void main(String[] args) {
int score = 59;
if (score >= 90) {
System.out.println("秀儿");
}
} else if (score >= 70) {
System.out.println("中儿");
} else if (score >= 60) {
System.out.println("过儿");
} else {
System.out.println("让你爹穿着拖鞋来学校一趟");
}
}
}
【补充知识点 从键盘上获取用户输入的数据】
Scanner 使用,不允许学会,只允许复制粘贴(CV)
1. 导包
在 class 上方 复制粘贴一下内容
import java.util.Scanner;
2. 创建 Scanner 变量 固定格式
Scanner sc = new Scanner(System.in);
3. 选择合适的工具
int类型数据获取
int类型变量 = sc.nextInt();
float类型数据获取
float类型变量 = sc.nextFloat();
double类型数据获取
double类型变量 = sc.nextDouble();
char类型数据获取
char类型变量 = sc.nextLine().charAt(0);
【补充知识点 用户友好性提示】
给予用户友好性提示
【补充知识点 用户输入数据合法性判断】
需要对用户输入数据进行判断,是否满足当前需求
// if else-if
// 导包
import java.util.Scanner;
class Demo7 {
public static void main(String[] args) {
int score = 59;
// 创建 Scanner 变量 sc
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生的成绩:");
// 通过该 sc 调用 nextInt() 方法从键盘上获取 int 类型数据
score = sc.nextInt();
// 用户输入数据合法性判定
if (score > 100 || score < 0) {
// 给予用户操作失败友好提示
System.out.println("亲, 您输入的数据有误哦~~啾咪 (づ ̄3 ̄)づ╭?~");
// 终止程序运行
System.exit(0);
}
if (score >= 90) {
System.out.println("秀儿");
} else if (score >= 80) {
System.out.println("良儿");
} else if (score >= 70) {
System.out.println("中儿");
} else if (score >= 60) {
System.out.println("过儿");
} else {
System.out.println("让你爹穿着拖鞋来学校一趟");
}
}
}