第二天的来啦。
1 运算符
常用的运算符:
算术运算符、赋值运算符、自增自减运算符、关系运算符、逻辑运算符、三元运算符
1.1 算术运算符
符号 | 作用 | 说明 |
---|---|---|
+ | 加 | 对数字进行加法运算,对字符串进行拼接。 |
- | 减 | 进行减法操作 |
* | 乘 | 进行乘法操作 |
/ | 除 | 整数相除的结果只能是整数,想要得到小数,必须有浮点数参与运算。 |
% | 取余 | a%b,获得a和b相除的余数。 |
//算术运算符代码
public class SuanShuDemo1 {
public static void main(String[] args) {
int a = 5;
int b = 2;
//进行算术运算
System.out.println(a + b);
System.out.println(a - b);
System.out.println(a * b);
//除法得到的是商,整数相除,结果是整数
System.out.println(a / b); // 2
//取余得到是余数
System.out.println(a % b); // 1
//整数相除只能得到整数,要想得到小数,必须有浮点数的参与
System.out.println(5 / 2); //2
System.out.println(5.0 / 2); //2.5
}
}
1.1.1 字符的+运算
字符参与运算的规则:
所有的字符在计算机都是对应一个数字
将字符换算成计算机底层(编码表)对应的数值进行计算。
编码表:
计算机只能识别数字,所有的文字和符号都必须转换成对应的数值才能被计算机识别和计算。字符和数字互相转换的规则就是编码表。
世界上第一张编码表是美国标准信息交换码,简称ASCII码表。
常见字符和数字的对应关系:
‘a’ ~ ‘z’ : 97 ~ 122
‘A’ ~ ‘Z’ : 65 ~ 90
‘0’ ~ ‘9’ : 48 ~ 57
扩展:汉字使用GBK编码,基本汉字对应的数字编码范围:19968 ~ 40869
/*
字符参与运算的规则:
根据编码表将字符换算成对应的数值进行运算。
a~z 97~122
A~Z 65-90
0~9 48~57
*/
public class CharDemo2{
public static void main(String[] args){
System.out.println('a'+10); //107
System.out.println('A'+10); //75
System.out.println('0'+10); //58
//字符的常见两种表达形式
// 1.使用单引号括起来
char c1 = 'a';
// 2.使用数字表示
char c2 = 97;
System.out.println(c1);
System.out.println(c2);
}
}
1.1.2 表达式类型提升
- byte、short、char变量之间进行运算时,类型自动提升为int。
- 运算结果提升为表达式中参与运算的最高类型。
public class SuanShuDemo3 {
public static void main(String[] args) {
// 1、byte、short、char变量之间进行运算时,类型自动提升为int。
byte b1 = 10;
// byte b2 = b1 + 5;
//编译报错,b+5,变量b会自动提升为int类型,运算结果为int,赋值给byte需要强转。
int b2 = b1 + 5;
System.out.println(b2);
char c1 = 'a';
int c2 = c1 + 10; // char类型变量运算,结果自动提升为int类型
System.out.println(c2);
// 2. 变量参与运算时,最终结果以最高类型为准。
int a = 100;
double d = 3.14;
double d2 = a + d;
System.out.println(d2);
//两个short类型结果也会提升为int类型
short s1 = 10;
short s2 =10;
int s3 = s1+ s2;
System.out.println(s3);
}
}
【练习题】
//byte short char变量进行运算,结果会提升为int
//整个表达式的结果会提升为参与运算的最高类型
有两个变量定义如下:
byte b = 10;
short s = 20;
指出下面一段代码中有问题的代码行号( 124 )
1 short s2 = b + s; //b+s结果提升为int ,不能直接赋值给short类型的变量 int s2 = b+s
//short s2 = (short)(b+s);
2 short s3 = s + 5; //s+5提升为int类型,不能直接赋值给short类型的变量
3 short s4 = 10 + 20; //常量的运算在编译期间就能确定值,编译器将代码转为: short s4 = 30;
4 float f = b + 1.0; //1.0是double类型,b + 1.0结果是double,不能直接赋值给float
5 double d = s + 1.0F;
//short + float ,结果是float类型,可以直接赋值给double,属于自动转换
【单选题】以下关于数据类型的转换,说法错误的是( B )
A:int a = 1;
byte b = 1;
System.out.println(a+b); 程序不会报错并且打印2
B:int类型的数据转为double类型,需要强制转换。
C:int类型转成short砍掉2个字节,可能造成数据丢失。
D:short h = 1; h=h+1; 需要使用强制转换才能编译成功。 //h+1结果为int类型,不能赋值给short
//强转 short h = (short)(h+1);
1.1.3 字符串的+运算
与字符串进行 + 运算,是进行字符串拼接操作,运算结果还是字符串。
字符串只能进行 + 运算。
/*
以下语句的输出结果是什么?
*/
public class StringAddDemo{
public static void main(String[] args){
System.out.println("hello" + 3 + 4); //hello34
System.out.println(3 + 4 + "hello"); //7hello
System.out.println(3 + 4 + "hello" + 5 + 6); //7hello56
System.out.println(3 + 4 + "hello" + (5 + 6)); //7hello11
}
}
强化练习
/*
需求:
定义两个变量:
int a = 3;
int b = 4;
请使用字符串对变量进行拼接,在控制台输出:3 + 4 = 7
*/
public class StringTest{
public static void main(String[] args){
int a = 3;
int b = 4;
//System.out.println("3 + 4 = 7");
System.out.println(a + " + " + b + " = "+ (a+b));//3 + 4 = 7
}
}
1.2 赋值运算符
赋值运算符分为基本赋值运算符和扩展赋值运算符。
符号 | 作用 | 说明 |
---|---|---|
= | 赋值 | a=10,将10赋值给变量a |
+= | 加后赋值 | a+=b,将a+b的值给a |
-= | 减后赋值 | a-=b,将a-b的值给a |
*= | 乘后赋值 | a*=b,将a×b的值给a |
/= | 除后赋值 | a/=b,将a÷b的商给a |
%= | 取余后赋值 | a%=b,将a÷b的余数给a |
注意:扩展的赋值运算符隐含了强制类型转换。
/*
赋值运算符:
扩展赋值运算符隐含了强制类型转换
*/
public class FuZhiDemo {
public static void main(String[] args) {
//1. 基本赋值运算符
int a = 10;
System.out.println(a);
//2. 扩展赋值运算符
int b = 20;
// b+=5;
// System.out.println(b);//25
// b-=5;
// System.out.println(b);//15
// b*=5;
// System.out.println(b);//100
// b/=5;
// System.out.println(b);//4
b%=5;
System.out.println(b);//0
// 3. 扩展赋值运算符隐含了强制类型转换
byte num = 10;
num+=5; // 相当于num = (byte)(num+5);
System.out.println(num);
}
}
1.3 自增自减运算符
符号 | 作用 | 说明 |
---|---|---|
++ | 自增 | 变量的值加1 |
– | 自减 | 变量的值减1 |
使用说明
1、++ 、 – 可以放在变量的前面,也可以放在变量的后面。
单独进行运算时放在前面或者后面,效果一样。
2、参与其他运算的时候:
a++ :先将a的值参与其他运算,运算结束后再自身加1。
++a :先将a自身加1,再将自增后的值参与其他运算。
自减与自增规则相同。
3、最常见用法:单独使用。
//【案例代码】
public class ZiZengDemo{
public static void main(String[] args){
// 1、单独运算
int a = 10;
a++;
int b = 10;
++b;
System.out.println(a); //11
System.out.println(b); //11
// 2、参与其他运算
int a1 = 10;
int b1 = a1++;
System.out.println(a1); //11
System.out.println(b1); //10
int a2 = 10;
int b2 = ++a2;
System.out.println(a2); //11
System.out.println(b2); //11
}
}
【练习】根据以下的代码得出的a、b、c和d的值为?( D )
int a=5,c=5,b,d;
b=a++-1; //b=5-1=4, a++ a=6
d=++c-1; //++c c=6 d=6-1=5
System.out.println(a+","+b+","+c+","+d);//a = 6 b=4 c=6 d=5
A: 5,4,5,5
B: 6,5,6,5
C: 6,4,6,4
D: 6,4,6,5
符号 | 作用 | 说明 |
---|---|---|
== | 等于 | a == b,判断如果a等于b,则为true,否则为false |
!= | 不等于 | a!=b,判断如果a不等于b,则为true,否则为false |
> | 大于 | a>b,如果a大于b,则为true,否则为false |
>= | 大于等于 | a>=b,如果a大于等于b,则为true,否则为false |
< | 小于 | a<b,如果a小于b,则为true,否则为false |
<= | 小于等于 | a<=b,如果a小于等于b,则为true,否则为false |
注意:
- 关系运算符的运算结果都是boolean类型,要么是true,要么是false。
- = 是赋值符号, == 才是判断是否相等的符号。
/*
关系运算符案例代码
*/
public class GuanXiDemo {
public static void main(String[] args) {
//定义变量
int i = 10;
int j = 20;
int k = 10;
//相等 ==
System.out.println(i == j);
System.out.println(i == k);
System.out.println("--------");
//不等 !=
System.out.println(i != j);
System.out.println(i != k);
System.out.println("--------");
//大于 >
System.out.println(i > j);
System.out.println(i > k);
System.out.println("--------");
//大于等于 >=
System.out.println(i >= j);
System.out.println(i >= k);
System.out.println("--------");
//如果把 ==写成了=
//把j的值赋值给了i,然后输出i的值
System.out.println(i = j);
}
}
1.5 逻辑运算符
int age ; 大于等于0,小于等于150
0<=age<=150
age>=0 & age<=150
逻辑运算符特点
1. 逻辑运算符用于连接关系表达式,描述更复杂的逻辑关系。
2. 逻辑运算符的运算结果是boolean类型。
逻辑运算符分类
符号 | 作用 | 说明 | 运算结果 |
---|---|---|---|
& | 逻辑与 | 表达式1 & 表达式2 | 有false则false |
| | 逻辑或 | 表达式1 | 表达式2 | 有true则true |
! | 逻辑非 | ! (表达式) | 对表达式结果取反 |
^ | 逻辑异或 | 表达式1 ^ 表达式2 | 不同为true,相同为false |
符号 | 作用 | 说明 |
---|---|---|
&& | 短路与 | 作用和&相同,但是有短路效果 |
|| | 短路或 | 作用和|相同,但是有短路效果 |
区别:
- 表达式1 & 表达式2 :所有表达式都会执行。
- 表达式1 && 表达式2 :如果表达式1为false,则右边表达式不再执行,可以提高效率。
- 表达式1 | 表达式2 :所有表达式都会执行。
- 表达式1 || 表达式2 :如果表达式1为true,则右边表达式不再执行,可以提高效率。
实际开发中,会使用短路与&&、短路或||来提高运算效率。
/*
逻辑运算符案例
*/
public class LogicDemo1 {
public static void main(String[] args) {
//定义变量
int i = 10;
int j = 20;
int k = 30;
//& :逻辑与,有false则false
System.out.println((i > j) & (i > k)); //false & false,输出false
System.out.println((i < j) & (i > k)); //true & false,输出false
System.out.println((i > j) & (i < k)); //false & true,输出false
System.out.println((i < j) & (i < k)); //true & true,输出true
System.out.println("--------");
//| :逻辑或,有true则true
System.out.println((i > j) | (i > k)); //false | false,输出false
System.out.println((i < j) | (i > k)); //true | false,输出true
System.out.println((i > j) | (i < k)); //false | true,输出true
System.out.println((i < j) | (i < k)); //true | true,输出true
System.out.println("--------");
//^ :逻辑异或,相同为false,不同为true
System.out.println((i > j) ^ (i > k)); //false ^ false,输出false
System.out.println((i < j) ^ (i > k)); //true ^ false,输出true
System.out.println((i > j) ^ (i < k)); //false ^ true,输出true
System.out.println((i < j) ^ (i < k)); //true ^ true,输出false
System.out.println("--------");
//! :逻辑非,取反
System.out.println((i > j)); //false
System.out.println(!(i > j)); //!false,,输出true
}
}
短路效应演示代码
//案例代码:短路逻辑运算符
public class LogicDemo2{
public static void main(String[] args){
int a = 10;
int b = 10;
// 逻辑与 & :所有表达式都会执行
System.out.println( (a++ > 100) & (b++ < 100) ); //false
System.out.println(a); //11
System.out.println(b); //11
// 短路与 && :具有短路效应,左边为false时,右边不执行
System.out.println( (a++ > 100) && (b++ < 100) ); //false
System.out.println(a); //11
System.out.println(b); //10
// 逻辑或 | :所有表达式都会执行
System.out.println( (a++ < 100) | (b++ < 100) ); //true
System.out.println(a); //11
System.out.println(b); //11
// 短路或 || :具有短路效应 ,左边结果为true时,右边不执行。
System.out.println( (a++ < 100) || (b++ < 100) ); //true
System.out.println(a); //11
System.out.println(b); //10
}
}
1.6 三元运算符
语法格式:
关系表达式 ? 表达式1 : 表达式2;
执行流程:
执行判断表达式,判断结果是boolean类型,为true时执行表达式1并返回结果,false执行表达式2并返回结果。
【举例:使用三元运算符求a和b的较大值】int a = 10;int b = 20;int max = a > b ? a : b;
// 判断 a>b 是否为true,如果为true取a的值,如果为false,取b的值
练习案例
/*
【两只老虎案例】
动物园里有两只老虎,已知两只老虎的体重分别为180kg、200kg,
请用程序实现判断两只老虎的体重是否相同
(求两个数是否相等)
*/
public class SanYuanDemo1{
public static void main(String[] args){
int a = 180;
int b = 200;
boolean result = a==b?true:false;
System.out.println(result);
//System.out.println(a==b);
}
}
/*
【三个和尚案例】
一座寺庙里住着三个和尚,
已知他们的身高分别为150cm、210cm、165cm,
请用程序实现获取这三个和尚的最高身高
(求三个数的最大值)
*/
public class SanYuanDemo2{
public static void main(String[] args){
int a = 150;
int b = 210;
int c = 165;
//先求出a和b的较大值
int tempMax = a>b ? a:b ;
//将tempMax和c比较,得到最大值
int max = tempMax>c ? tempMax:c ;
System.out.println("最大值是:"+max);
}
}
2 Scanner键盘录入
Scanner类的作用是什么?
Scanner是JDK提供的用于获取键盘输入的数据的工具类。该类位于java.util包下。
Scanner的使用步骤?
1.导包
import java.util.Scanner
2.创建Scanner的对象
Scanner sc = new Scanner(System.in);
3.调用方法接收数据,nextInt方法用于接收一个整数
int num = sc.nextInt();
//【案例代码】
//1、导包
import java.util.Scanner;
public class ScannerDemo1 {
public static void main(String[] args) {
//2、创建Scanner的对象
Scanner sc = new Scanner(System.in);
//3、调用方法接收数据
int num = sc.nextInt();
//输出数据
System.out.println("num:" + num);
}
}
练习案例:
/*
使用键盘录入两个整数,并在控制台打印两个整数的和
*/
import java.util.Scanner;
public class ScannerDemo2 {
public static void main(String[] args) {
//创建对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个数据:");
//调用nextInt()方法,接收数据
int a = sc.nextInt();
//调用nextInt()方法,接收数据
System.out.println("请输入第二个数据:");
int b = sc.nextInt();
//求和
int sum = a + b;
System.out.println("两个数的和:"+sum);
}
}
/*
【三个和尚升级版】
需求:
使用键盘录入三个和尚的身高,并求最高身高。
*/
import java.util.Scanner;
public class ScannerDemo3 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//使用键盘分别录入三个和尚的身高
System.out.println("请输入第一个和尚的身高:");
int h1 = sc.nextInt();
System.out.println("请输入第二个和尚的身高:");
int h2 = sc.nextInt();
System.out.println("请输入第三个和尚的身高:");
int h3 = sc.nextInt();
//先求出h1和h2的较大值
int tempMax = h1 > h2 ? h1 : h2;
//再求出tempMax和h3的较大值
int max = tempMax > h3 ? tempMax : h3;
//输出结果
System.out.println("这三个和尚中身高最高的是:" + max +"cm");
}
}
3 流程控制语句
流程控制语句分为
顺序结构、选择(分支)结构、循环结构
3.1 顺序结构
按照代码书写顺序,从上往下执行。
3.2 选择结构(if switch)
◆ if语句格式1
格式:
if (关系表达式) {
语句体;
}
执行流程:
①首先计算关系表达式的值。
②表达式的值为 true 时执行语句体,为 false 时不执行语句体。
③往下执行 if结构 后面的语句内容。
/*
键盘录入两个整数a和b,使用if语句判断两个整数是否相等,
相等输出:a和b相等
否则输出:a和b不相等
*/
import java.util.Scanner;
public class IfDemo1{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//获取键盘输入的两个整数
System.out.println("请输入第一个整数");
int a = sc.nextInt();
System.out.println("请输入第二个整数");
int b = sc.nextInt();
if(a==b){
System.out.println("a和b相等");
}
if(a!=b){
System.out.println("a和b不相等");
}
//if-else
if(a==b){
System.out.println("a和b相等");
}else{
System.out.println("a和b不相等");
}
}
}
◆ if语句格式2
格式:
if(关系表达式){
语句体1;
}else{
语句体2;
}
执行流程:
①首先计算关系表达式的值。
②表达式的值为 true 时执行语句体1,为 false 时执行语句体2。
③继续执行 if-else 结构后面的语句内容。
/*
【if-else案例1】
键盘录入两个整数a和b,使用if-else判断两个整数是否相等,
相等输出:a和b相等
否则输出:a和b不相等
*/
import java.util.Scanner;
public class IfDemo2{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//获取键盘输入的两个整数
System.out.println("请输入第一个整数");
int a = sc.nextInt();
System.out.println("请输入第二个整数");
int b = sc.nextInt();
//if-else 格式
if( a>b ){
System.out.println(a+"和"+b+"相等");
}else{
System.out.println(a+"和"+b+"不相等");
}
}
}
/*
【if-else案例2】
键盘录入一个整数,请用程序实现判断该整数是奇数还是偶数。
*/
public class IfDemo3{
public static void main(String[] args){
//通过键盘获取一个整数
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = sc.nextInt();
//如果一个数能被2整除,则该数为偶数(对2取余,余数为0)
if(num%2 == 0) {
System.out.println(num + "是偶数");
} else {
System.out.println(num + "是奇数");
}
}
}
/*
【思考】
键盘录入两个整数a和b,a和b的关系有以下三种情况:
a大于b, a等于b, a小于b
如何使用if或者if-else语句实现三种关系的判断?有没有其他方式?
*/
import java.util.Scanner;
public class IfDemo3{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//获取键盘输入的两个整数
System.out.println("请输入第一个整数");
int a = sc.nextInt();
System.out.println("请输入第二个整数");
int b = sc.nextInt();
//if语句实现3种关系的判断
/* if(a>b){
System.out.println(a+"大于"+b);
}
if(a<b){
System.out.println(a+"小于"+b);
}
if(a==b){
System.out.println(a+"等于"+b);
} */
//if -else实现(if语句的嵌套)
/* if(a==b){
System.out.println(a+"等于"+b);
}else{
//使用嵌套的if-else
if(a>b){
System.out.println(a+"大于"+b);
}else{
System.out.println(a+"小于"+b);
}
} */
//if的第三种格式
if(a==b){
System.out.println(a+"等于"+b);
}else if(a>b){
System.out.println(a+"大于"+b);
}else{
System.out.println(a+"小于"+b);
}
}
}
◆ if语句格式3
格式:
if(关系表达式1){
语句体1;
}else if(关系表达式2){
语句体2;
}
else{
语句体n+1;
}
【注意】:该格式中可以有多个else if结构,可以没有else结构。
执行流程:
①首先计算关系表达式1的值。
②如果为 true 则执行语句体1,为 false 时计算关系表达式2的值。
③如果为 true 则执行语句体2,为 false 时计算关系表达式3的值,以此类推。
④所有关系表达式都为false时,执行else里的语句体n+1。
案例代码:
/*
案例1:键盘录入一个1~7的整数,输出对应的星期一到星期日。
*/
import java.util.Scanner;
public class IfTest{
public static void main(String[] args){
//创建Scanner对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数(1~7):");
//接收键盘录入的整数
int week = sc.nextInt();
//使用if-elseif结构判断
if(week==1){
System.out.println("星期一");
}else if(week==2){
System.out.println("星期二");
}else if(week==3){
System.out.println("星期三");
}else if(week==4){
System.out.println("星期四");
}else if(week==5){
System.out.println("星期五");
}else if(week==6){
System.out.println("星期六");
}else if(week==7){
System.out.println("星期日");
}else{
System.out.println("您输入的数字无效!");
}
}
}
/*
案例2:
小明快要期末考试了,小明爸爸对他说,会根据他的考试结果,送他不同的礼物
95~100分,自行车一辆;
90~94分,游乐场玩一次;
80~89分,变形金刚玩具一个;
80分以下,胖揍一顿
*/
import java.util.Scanner;
public class IfTest {
public static void main(String[] args) {
//通过键盘录入考试成绩
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个分数:");
int score = sc.nextInt();
//由于奖励种类较多,属于多种判断,采用if...else...if格式实现
if(score>100 || score<0) {
System.out.println("你输入的分数有误");
} else if(score>=95 && score<=100) {
System.out.println("山地自行车一辆");
} else if(score>=90 && score<=94) {
System.out.println("游乐场玩一次");
} else if(score>=80 && score<=89) {
System.out.println("变形金刚玩具一个");
} else {
System.out.println("胖揍一顿");
}
}
}
学习目标
1、能够说出常见的运算符有哪几种
2、能够知道除法和取余的区别
3、能够完成字符和字符串的加法
4、能够知道&&和&的区别
5、能够使用三元运算符完成获取两个数中较大值
6、能够使用键盘录入数据并完成两个数据求和
7、能够使用if语句完成获取两个数中较大值
8、能够使用if语句完成根据分数输出对应级别
课后拓展练习
【拓展练习1】以下代码,输出x和y的值是多少?
int x = 10;
int y = x++ + x++ + x++;
System.out.println(x);//13
System.out.println(y);//33
/*
【拓展练习2】使用三元运算符把三个整数按从小到大打印。
*/
public class SanYuanTest2{
public static void main(String[] args){
int a = 60;
int b = 20;
int c = 30;
int tempMax = a > b ? a : b;
int max = tempMax > c ? tempMax : c;
int tempMin = a < b ? a : b;
int min = tempMin < c ? tempMin : c;
int s = (a+b+c) - max - min;
System.out.println(min+" "+s+" "+max);
}
}
/*
* 【拓展练习3】
* 键盘录入学生成绩,根据成绩判断学生属于哪个级别
* 90-100 优秀
* 80-90 好
* 70-80 良
* 60-70 及格
* 60以下 不及格
*/
import java.util.Scanner;
public class IfTest3{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入成绩");
int a = sc.nextInt();
if((a >= 90)&&(a <= 100)){
System.out.println("优秀");
}else if((a >= 80)&&(a <= 90)){
System.out.println("好");
}else if((a >= 70)&&(a <= 80)){
System.out.println("良");
}else if((a >= 60)&&(a <= 70)){
System.out.println("及格");
}else if((a >= 0)&&(a <= 60)){
System.out.println("不及格");
}else {
System.out.println("你输入的成绩有误");
}
}
}