运算符
一.算术运算符 +、-、*、/、%
在代码中,如果有小数参与计算,则可能结果会不精确,涉及到小数在计算机中的存储。
整数参与计算,结果只能得到整数
数字进行运算的时候,数据类型不一样不能参与运算,需要转成一样的,才能参与运算
1.类型转换
a.隐式转换(取值范围小的变成 取值范围大的)
取值范围从小到大:byte<short<int<long<float<double
提升规则:取值范围小的和取值范围大的进行运算,小的会先提升为大的,再进行运算
byte short char 三种数据类型在做运算的时候,都会先提升为int,然后再进行运算
b.强制转换
如果把一个取值范围大的数值,赋值给取值范围小的数值,是不允许直接赋值的,如果一定要这么操作,就要加入强制转换 不是自动的,需要代码
格式:数据类型 变量名=(目标数据类型) 被强制转换的数据
数据过大可能会发生错误
2.字符串的"+"操作符
a.当”+“操作中出现字符串,这个+时字符串连接符,而不是算术运算符,会将前后的数据进行拼接,产生一个新的字符串(不是只有两端都是字符串的时候才会产生新的字符串,只要有字符串出现,做的就是拼接操作)
b.当出现连续”+“操作时,从左到右做依次执行;1+87+”哈哈“ 结果是 ”88哈哈“
3.字符的"+"操作
当字符+字符或者字符+数字,会把字符通过ASCII表查询到对应的数字再进行计算
1+'a'->98 'a'+"abc"="aabc"
二.自增自减
单独使用时,++和--无论放在前面还是后面,结果都一样
int b=a++:先用后加,b=10 a=11
int b=++a:先加后用,b=11 a=11
三.赋值运算符
=、+=、-=、*=、/=、%= 底层都隐藏了一个强制类型转换
short x=1;s+=1;(等同于s = (short)( s + 1 ) )
四.关系运算符
==、!=、<、<=、>、>=
关系运算的结果都是布尔类型。
五.逻辑运算符
&(与)、|(或)、^(异或:相同则false,不同则true)、! (非)
短路逻辑运算符:&&、|| 运行结果与&、| 是一样的,但是运行效率更高:当左边的表达式能够确定最终的结果,那么右边就不会参与运行了
&、| :无论左边true false,右边都要执行
六.三元运算符
格式: 关系表达式?表达式1:表达式2;(C语言的三目表达式)
可以把这个直接赋值给一个变量,也可以直接打印
流程控制语句
顺序结构、分支结构、循环结构
一.分支结构
1.if语句
a. if (关系表达式) {语句体}
在语句体中,如果只有一行代码,大括号可以省略不写(如果这一行代码是int a= 100,就不行,所以最好都写上);如果对一个布尔类型的变量进行判断,不要用==,直接布尔类型的变量写在小括号中;
b.if (关系表达式){语句体1} else {语句体2}
c.if (关系表达式1){语句体} else if(关系表达式2){语句体2}…… else{语句体n+1}
从上往下依次判断,只要有一个为真,就执行相应的语句体;所有的都为假,就执行语句体n+1
2.switch语句
a.首先计算表达式里面的值,依次与case后面的值相比较,如果有对应的值,就会执行相应的语句,执行过程中,遇到break就会整个结束;如果case里面的语句都不匹配,就会执行default里面的语句体,然后结束整个语句;
b.表达式的取值为 byte short int char (枚举,String)
c.case后面的值只能是字面量,不能是变量,并且值不能重复
d.default的位置和省略;default不一定会写在最下面,而且它可以被省略
e.case穿透:
public class Test2{
public static void main(String[] args) {
int number=10;
switch (number){
case 1:
System.out.println("1");
break;
case 10:
System.out.println("10");
// break;
case 20:
System.out.println("20");
break;
default:
System.out.println("no");
break;
}
}
}
上面代码中输出的结果为10 20;执行过程:小括号里面的表达式会与下面的每一个case匹配,如果匹配上了就执行语句体,如果发现了berak就结束整个语句,如果没有发现break,就继续执行下一个语句,直到遇到break或者大括号为止。
如果有多个case语句重复了,也会考虑利用case穿透去简化代码。
f.switch新特性 JDK12
public class Test2{
public static void main(String[] args) {
int number=10;
switch (number){
case 1 ->{
System.out.println("1");
}
case 10 ->{
System.out.println("10");
}
case 20 ->{
System.out.println("20");
}
default -> System.out.println("no");
}
}
}
二.循环结构 for while do……while
1.for循环
for(初始条件语句;条件判断语句;条件控制语句) {循环体语句} 和C语言一样
!!变量不能定义在循环里面,如果定义在里面只在当前的循环中有效,当本次循环结束后,变量就会从内存中消失,第二次循环开始又会定义一个新的变量;
2.while 循环
初始化语句;
while(条件判断语句){
循环体语句;
条件控制语句;
}
for和while的区别:for循环中,控制循环的变量,在for循环结束后,就不能被访问到了
while循环中,控制循环的变量,不归属于其语法结构,在while循环结束后,还可以继续使用
使用场景:for 知道循环的次数或者范围;while 不知道循环的范围,只知道循环的结束条件
3.do ……while
初始化语句;
do {
循环体语句;
条件控制语句;
}while(条件判断语句);
先执行后判断,如果条件判断语句第一次就是false的话,循环体至少会执行一次
案列1:珠穆朗玛峰
public class Test4 {
public static void main(String[] args){
double height=8844430;
int count=0;
double paper=0.1;
while (paper < height){
count++;
paper=paper*2;
}
System.out.println(count);
}
}
案列2:回文数
import java.util.Scanner;
public class Test4 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数:");
int a = sc.nextInt();
int num = 0;
int temp = a;
while (a!=0){
//从右往左获取每一位数字
int ge = a % 10;
//修改a的值
a = a /10;
//拼接
num = num *10 + ge ;
}
//a=123 第一次:ge=3 a=12 num=3 第二次:ge=2 a=1 num=32 第三次:ge=1 a=0 num=321;
System.out.println(num);
System.out.println(num==temp);
}
}
案列3:两数相除,不用*、/、%
import java.util.Scanner;
public class Test4 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入被除数:");
int dividend = sc.nextInt();
System.out.println("请输入除数:");
int divisor = sc.nextInt();
int count=0;
while (dividend >= divisor){
dividend = dividend - divisor;
count++;
}
System.out.println("商是"+count);
System.out.println("余数是"+dividend);
}
}