发表于: 2018-09-17 22:58:52
1 426
一、今日完成:
练习-自增
int i = 1;
int j = ++i + i++ + ++i + ++i + i++;
问 j的结果是多少?
1、++i,i=2,返回2,先运算,再取值返回。
2、i++,i=3,返回2,先取值返回,再运算。
3、i=4,返回4
4、i=5,返回5
5、i=6,返回5
2+2+4+5+5=18
练习-BMI
使用Scanner收集你的身高体重,并计算出你的BMI值是多少
BMI的计算公式是 体重(kg) / (身高*身高)
比如邱阳波的体重是72kg, 身高是1.69,那么这位同学的BMI就是
72 / (1.69*1.69) = ?
import java.util.Scanner;
public class BMI {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println(“输入身高(m):”);
float height = s.nextFloat();
System.out.println(“身高为:”+ height);
System.out.println(“输入体重(kg):”);
int weight = s.nextInt();
System.out.println(“体重为:”+ weight);
int bmi = weight / (height*height);
System.out.println(“BMI为:”+ bmi);
}
}
关系操作符
> 大于
>= 大于或等于
< 小于
<= 小于或等于
== 是否相等
!= 是否不等
练习,
借助Scanner获取控制台输入的两个任意数字,然后使用
> 大于
>= 大于或等于
< 小于
<= 小于或等于
== 是否相等
!= 是否不等
判断两个值之间的关系
逻辑运算符
无论长路与还是短路与
两边的运算单元都是布尔值
都为真时,才为真
任意为假,就为假
区别
长路与 两侧,都会被运算
短路与 只要第一个是false,第二个就不进行运算了
两个&,&&才是短路与。
无论长路或还是短路或
两边的运算单元都是布尔值
都为假时,才为假
任意为真,就为真
区别
长路或 两侧都会被运算
短路或 只要第一个是true的,第二个就不进行运算了
同理,两个|,||才是短路或。
取反!
异或^
不同,返回真
相同,返回假
这个与关系操作符中的
== 是否相等
!= 是否不等
异曲同工
练习,
int i = 1;
boolean b = !(i++ == 3) ^ (i++ ==2) && (i++==3);
System.out.println(b);
System.out.println(i);
输出结果是?
难点在于,需要弄清楚各个运算符的优先级
括号优先级最高,所以括号内的为一个整体,先算,!优先级3,所以与(i++ == 3)构成一个二级整体!(i++ == 3),^优先级高于短路与,所以与!(i++ == 3), (i++ ==2)构成一个三级整体!(i++ == 3) ^ (i++ ==2) ,最后该三级整体与(i++==3)通过短路与连接起来。
i=2 返回值1 f t
i=3 返回值2 t
异或,f
短路与,第一个表达式为假,第二个就不用算了
最后结果为假。
网上找到了一张表,挺直观的,博主说的对,科技进步——源自每一次善意的分享
运算符的优先级(从高到低)
优先级 | 描述 | 运算符 |
1 | 括号 | () [] |
2 | 正负号 | + - |
3 | 自增自减,非 | ++ -- ! |
4 | 乘除,取余 | * / % |
5 | 加减 | + - |
6 | 移位运算 | << >> >>> |
7 | 大小关系 | > >= < <= |
8 | 相等关系 | == != |
9 | 按位与 | & |
10 | 按位异或 | ^ |
11 | 按位或 | | |
12 | 逻辑与 | && |
13 | 逻辑或 | || |
14 | 条件运算 | ?: |
15 | 赋值运算 | = += -= *= /= %= |
16 | 位赋值运算 | &= |= <<= >>= >>>= |
位操作符
位操作都是对二进制而言的,本节先跳过。
赋值操作符
赋值操作的操作顺序是从右到左
int i = 5+5;
首先进行5+5的运算,得到结果10,然后把10这个值,赋给i
对本身进行运算,并赋值
+=即自加
i+=2;
等同于
i=i+2;
其他的 -= , *= , /= , %= , &= , |= , ^= , >>= , >>>= 都是类似
练习,
int i = 1;
i+=++i;
心算i的值是?
i=i+(++i)
自增的优先级高,所以先算++i,i=2,返回值为2,那么i=2+2=4;
但是,答案是3,问题出在,++i执行完之后,i到底有没有被赋值,为什么没有变成2.
百度之后,因为是从左往右运算,第一个i值为1,后面++i的操作对第一个i值不产生影响,看来我对优先级的理解有误。
{.............................................................................
相同优先级中,按结合顺序计算。大多数运算是从左至右计算,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。
.............................................................................
}
{.............................................................................
简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
堆内存用来存放由new创建的对象和数组。
.............................................................................
}
三元操作符
表达式?值1:值2
如果表达式为真 返回值1
如果表达式为假 返回值2
练习,
通过Scanner输入一个1-7之间的整数,使用三元操作符判断是工作日还是周末?
import java.util.Scanner;
public class HelloWorld {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println(“输入一个1-7之间的整数:”);
int a = s.nextInt();
int b = a > 5 ? "周末":"工作日";
System.out.println(b);
}
}
SCANNER
注意: 使用Scanner类,需要在最前面加上
import java.util.Scanner;
表示导入这个类,才能够正常使用
Scanner s = new Scanner(System.in);//创建对象
int a = s.nextInt();
float b = s.nextFloat();
String c = s.nextLine();
需要注意的是,如果在通过nextInt()读取了整数后,再接着读取字符串,读出来的是回车换行:"\r\n",因为nextInt仅仅读取数字信息,而不会读取回车换行"\r\n".?
所以,如果在业务上需要读取了整数后,接着读取字符串,那么就应该连续执行两次nextLine(),第一次是取走回车换行,第二次才是读取真正的字符串
IF 条件语句
if(表达式1){
表达式2;
}
如果表达式1的值是true,
就执行表达式2
如果只有一个表达式可以不用写括弧,看上去会简约一些
else 代表不成立的情况
else if 是多条件判断
如果使用else if, 一旦在18行,判断成立, 20行和22行的判断就不会执行了,节约了运算资源
练习-BMI
基于前面的操作符练习-BMI,做基于判断的改进:
使用Scanner收集你的身高体重,并计算出你的BMI值是多少
BMI的计算公式是 体重(kg) / (身高*身高)
比如邱阳波的体重是72kg, 身高是1.69,那么这位同学的BMI就是
72 / (1.69*1.69) = ?
然后通过条件判断BMI的范围,打印出是超重还是正常
import java.util.Scanner;
public class BMI {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println(“输入身高(m):”);
float height = s.nextFloat();
System.out.println(“身高为:”+ height);
System.out.println(“输入体重(kg):”);
int weight = s.nextInt();
System.out.println(“体重为:”+ weight);
int bmi = weight / (height*height);
System.out.println(“BMI为:”+ bmi);
if(bmi < 18.5)
System.out.println(“体重过轻”);
else if(18.5 <= bmi < 24)
System.out.println(“正常”);
else if(24 <= bmi < 27)
System.out.println(“体重过重”);
else if(27 <= bmi < 30)
System.out.println(“轻度肥胖”);
else if(30 <= bmi < 35)
System.out.println(“中度肥胖”);
else if(35 <= bmi)
System.out.println(“重度肥胖”);
}
}
练习-闰年
判断某一年是否为闰年
通过Scanner 输入一个年份,然后判断概念是否是闰年
闰年判断标准(满足任何一个)
1. 如果能够被4整除,但是不能被100整除
2. 能够被400整除
import java.util.Scanner;
public class Year {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println(“输入年份:”);
int year = s.nextInt();
If(year % 400 == 0 || (year % 4 == 0 && year %100 != 0 ))
System.out.println(“是闰年”);
else
System.out.println(“不是闰年”);
}
}
二、明日计划:
今天又没有按时完成计划,真好,没有紧迫感。。。后天出去野外考察,又没有多少学习时间了。
还是调整一下计划吧,明天减少到两块内容,控制流程与数组。
三、问题:
在练习运算符的时候,对i+=++i,该式子的运算过程产生了疑惑,百度后解决,一开始想不通是对运算顺序理解有误。
四、收获:
了解了操作符及if语句。
评论