一,运算符
运算符和表达式:
1,运算符
对字面量或变量进行操作的符号
1,算数运算符,+(加),-(减),×,÷(除),%(取模。取余)
2,整数参与计算,结果只能是整数
3,小数参与计算,结果可能是不精确的
4,练习:键盘录入一个三位数,将其拆分成个位,十位,百位后,打印在控制台
package day01.com; import java.util.Scanner; public class itheima { public static void main(String[] args) { //键盘录入 Scanner sc = new Scanner(System.in); int a = sc.nextInt(); System.out.print(a%10+"\t"); System.out.print(a%100/10+"\t"); System.out.print(a/100+"\t"); } }
输入:123
输出:3 2 1
2,表达式
用运算符将字面量或者变量链接起来,符合Java语法的式子就可以称为表达式。
3,算术运算符的高级用法
1,数字相加
数字进行运算时,数据类型不一样不能运算,需要转成一样的才能计算。
类型转换分类
隐式转换:取值范围小的数值----→取值范围大的
两种提升规则:1,取值范围小的和取值范围大的进行计算时,小的转换为大的再计算
2,byte,short,char三种类型的数据在运算时,都会直接提升为int,然后再进行计算
强制转换:取值范围大的数值--→取值范围小的
如果把取值大的数值,赋值给取值小的变量,是不允许直接赋值的,需要加入强制转 换,如果数值过大会导致溢出错误。
格式:目标数据类型 变量名 = (目标数据类型)被强制转换的数值;
2,字符串“+”操作
1,当“+”操作中出现字符串时,这个“+”是字符串连接符,而不是算数运算符了。会将前后的数据进行拼接,并产生一个新的字符串。例·:“123”+123,输出“123123”
2,连续进行“+”操作时,从左到右逐个执行。例:1+99+“mmm”,输出:100mmm
3,字符相加
当 字符+字符 或者 字符+数字 时,会把字符通过ASCII码表查询到的对应数字进行计算
4,自增自减运算符
1,自增运算符
++ 加 变量的值加一
2,自减运算符
-- 减 变量的值减一
3,两种用法
1,单独使用:++,--无论放在变量前面还是后面,单独写一行结果都是一样的。
2,参与计算
int b = a++;先用后加
int b = ++a;先加后用
public class itheima { public static void main(String[] args) { int x = 10; int y = x++; int z = ++x; System.out.println("x = "+x); System.out.println("y = "+y); System.out.println("z = "+z); } }
结果:x = 12
y = 10
z = 12
5,赋值运算符
符号 | 作用 | 说明 |
= | 赋值 | int 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 |
6,关系运算符
符号 | 说明 |
== | 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。
7,逻辑运算符
符号 | 作用 | 说明 |
& | 逻辑与(且) | 并且,两边都为真,结果为真 |
| | 逻辑或 | 或者,两边都为假,结果为假 |
^ | 逻辑异或 | 相同为真,不同为假 |
! | 逻辑非 | 取反 |
&& | 短路逻辑与 | 结果与&效果相同,但是有短路效果 |
|| | 短路逻辑或 | 结果与|效果相同,但是有短路效果 |
注:短路效果指的是如果左边结果能确定最终答案,则右边不会被运行了。
8,三元运算符
格式:关系表达式?表达式1:表达式2;
- 注:如果关系表达式的结果为true,则将结果赋值给表达式1,结果为假,则将结果赋值给表达式2.
- 整个三元运算符的结果必须被使用
public class itheima {
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
int max = num1 > num2 ? num1 : num2;
System.out.println(max);
System.out.println(num1 > num2 ? num1 : num2);
}
}
结果:20
20
9,原码,反码,补码
- 什么是原码?
- 原码:十进制数据的二进制表现形式,最左边是符号位,0为正1为负,一个0或1为1bit,8个bit为1个字节
- 但是如果是负数计算,结果就出错,实际运算的结果跟我们预期结果是相反的。
- 反码:为了解决原码不能计算负数的问题而出现的
- 计算规则:正数的反码不变,负数的反码在原码基础上,符号位不变,数值取反,0→1,1→0
- 反码的弊端:负数运算的时候,如果结果不跨0,没问题,但如果跨0,结果会偏差1
十进制数 原码 反码 补码 +0 0000 0000 0000 0000 0000 0000 -0 1000 0000 1111 1111 0000 0000 -1 1000 0001 1111 1110 1111 1111 -2 1000 0010 1111 1101 1111 1110 -3 1000 0011 1111 1100 1111 1101 -4 1000 0100 1111 1011 1111 1100 -5 1000 0101 1111 1010 1111 1011 -6 1000 0111 1000 1000 1000 0010 -128 无 无 1000 0000 注:正数的原码,反码,补码都一样,负数的补码=反码+1
计算机中的存储与计算都是以补码的形式进行的。
10,其他运算符
运算符 | 含义 | 运算规则 |
& | 逻辑与 | 0为false ,1为true |
| | 逻辑或 | 0为false ,1为true |
<< | 左移 | 向左移动,低位补0 |
>> | 右移 | 向右移动,高位补0或1 |
>>> | 无符号右移 | 向右移动,高位补0 |
二,流程控制语句
1,顺序结构
顺序结构语句是Java程序默认的执行流程,按照代码的先后顺序,从上到下依次执行
2,分支结构、
1,if语句
1,if语句的第一种格式
格式:if(关系表达式){
语句体;
}
注:在语句体中,如果只有一句代码,大括号可以省略不写
如果对一个布尔类型变量进行判断,不要使用==号
2,if的第二种格式
if(关系式){
语句体1;
}
else{
语句体2;
}
执行流程:
Ⅰ 首先计算关系式的值
Ⅱ 如果关系表达式的值为true,就执行语句体1
Ⅲ 如果关系表达式的值为false,就执行语句体2
Ⅳ 继续执行后面的其他语句
3,if的第三种格式
if(关系式){
语句体1;
}else if(关系表达式2){
语句体2;
}
.......
else{
语句体n+1;
}
执行流程:
Ⅰ 首先计算关系式1的值
Ⅱ 如果关系表达式的值为true,就执行语句体1,如果为false就计算关系表达式2的值
Ⅲ 如果关系表达式的值为true,就执行语句体2,如果为false就计算关系表达式3的值
Ⅳ 继续执行后面的其他语句
总结:从上往下依次进行判断,只要有一个判断为真,就执行对应的语句体,如果所有的判断都为假,就执行esle的语句体。
2,switch语句
switch(表达式){
case 值1;
语句体1;
break;
case 值2;
语句体2;
break;
default:
语句体n+1;
break;
}
执行流程:
Ⅰ首先计算表达式的值
Ⅱ依次和case后面的值进行比较,如果有对应的值,就会执行相应语句,在执行的过程中,遇到break就会结束
Ⅲ 如果所有的case后面的值和表达式的值都不匹配,就会执行default里面的语句体,然后结束整个switch语句。
格式说明:
Ⅰ 表达式:(将要匹配的值)取值为byte,short,int,char
Ⅱ case:后面跟的是要和表达式进行比较的值(被匹配的值)
Ⅲ break:表示中断,结束的意思,用来结束switch语句。
Ⅳ default:表示所有情况都不匹配的时候,就执行该处的内容,和if语句的esle相似
Ⅴcase后面的值只能是字面量,不能是变量
Ⅵ case给出的值不允许重复
switch其他知识点:
Ⅰ default的位置和省略
- default不一定写在最下面,我们可以写在任意位置,只是习惯写在下方
- default可以省略,语法不会报错,但不建议省略
Ⅱ case穿透
- case穿透是语句中没有break导致的。
- 执行流程:
- 首先还是会将小括号内表达式值与下面每一个case进行匹配
- 如果匹配上,就执行对应的语句体,如果发现break,就结束switch语句
- 如果没有发现break,那么程序会执行下一个case语句体,直到遇到break或者右大括号
import java.util.Scanner; public class itheima { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); switch (num){ case 1: System.out.println("值1"); case 2: System.out.println("值2"); case 3: System.out.println("值3"); } } }
输入:2
输出:值2
值3Ⅲ switch新特性
import java.util.Scanner; public class itheima { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); switch (num){ case 1 -> System.out.println("值1"); case 2 -> System.out.println("值2"); case 3 -> System.out.println("值3"); } } }
输入:2
输出:值2
3,循环结构
1,什么是循环?
- 重复的做某件事
- 具有明确的开始和停止标记
2,循环的分类
1,for
格式:
for(初始化语句;条件判断语句;条件控制语句){
循环体语句;
}
执行流程:
- 执行初始化语句
- 执行条件判断语句,看结果是true还是false
- 如果是false循环结束
- 如果是true,执行循环体语句
- 执行条件控制语句
- 回到2继续执行判断语句
注:
- 初始化语句只会执行一次
- 判断语句为true,循环继续
- 判断语句为false,循环结束
2,while
格式:
初始化语句;
while(条件判断语句){
循环体语句;
条件控制语句;
}
注:
- 初始化语句只会执行一次
- 判断语句为true,循环继续
- 判断语句为false,循环结束
3,for和while的对比
- for循环中:知道循环次数或循环范围时使用
- while循环:不知道循环次数和范围,只知道结束条件。
4,do.....while
格式:
初始化语句;
do{
循环体语句;
条件控制语句;
}while(条件判断语句);
3,循环的高级综合练习
1,无限循环:循环不会停下来
注:无限循环的下面不能再写代码了,因为循环不会停止,下面的代码永远执行不到。
2,跳转控制语句
continue:
public class itheima { public static void main(String[] args) { for (int i = 1; i < 5; i++) { if(i == 3){ //结束本次循环,继续下一次循环 continue; } System.out.println("小虎在吃第" + i +"个包子"); } } }
break:
public class itheima { public static void main(String[] args) { for (int i = 1; i < 5; i++) { if(i == 3){ //结束本次循环,继续下一次循环 break; } System.out.println("小虎在吃第" + i +"个包子"); } } }