第2周 判断
2.1 比较
注释
用来区分代码块,可读性更高,//
单行注释,/* */
多行注释或行内注释
关系运算
-
智能并非多高级,能做一些判断就是智能
运算符 | 意义 |
---|---|
== | 相等 |
!= | 不相等 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
-
运算结果:true/false
-
运算符的优先级:
- 所有的关系运算符(== >=)的优先级低于算术运算(+ -),高于赋值运算(=)
- ==和!=的优先级低于其他关系运算符
- 连续的关系运算从左到右
例子 结果 5 > 3 == 6 > 4 先比较大小再判断是否相等,true 6 > 5 > 4 true > 4无法比较 a == b == true 先算a==b,得到true/false再判断是否与true相等 a == b == 6 先算a==b,得到true/false,true/false == 6无法比较 a == b > false 先算b > false,b为浮点数或布尔值,不能比较 (a == b) > false 先算a == b为true/false,true和false无大小关系,无法比较 -
int与double比较
int a =5;
double b = 5.0;
System.out.println(a==b);
//true
- double与double比较
double a = 1;
double b = 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1
System.out.println(a==b);
//false
浮点数在计算机内部表达有误差,double与double的比较不能简单地用==
,应该用如下方式:
Math.abs(f1-f2)<1e-5
double a = 1;
double b = 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1
System.out.println(Math.abs(a-b)<1e-6);
//true
2.2 判断
根据比较的结果,决定做、还是不做某些动作,就要用到if语句。
一个基本的if语句由一个关键字if开头,跟上在括号里的一个表示条件的逻辑表达式,然后是一对大括号“{}”之间的若干条语句。如果表示条件的逻辑表达式的结果为true,那么就执行后面跟着的这对大括号中的语句,否则就跳过这些语句不执行,而继续下面的其他语句。
有的时候我们希望在条件成立的时候做一件事情,而在条件不成立的时候做另外一件事情。这可以在if语句后面跟上一个else子句,形成一个if-else语句。
if (条件)
{
动作;
}
//if和{}一起组成一个完整的句子,{}里的句子后面加;
if (条件)
{
动作;
}
else
{
动作;
}
2.3 分支
嵌套
if ()
{
if(){
}else{
}
}
else
{
if(){
}else{
}
}
else总是和最近的那个if匹配
级联
if( x<0 ){
f = -1;
}
else if( x==0 )
{
f = 0;
}
else
{
f = 2*x;
}
System.out.println(f);
//单一出口,程序只在一个地方有输出
多路分支
switch( 控制表达式 )
{
case 常量:
语句
...
case 常量:
语句
...
default:
语句
...
}
- 控制表达式type只能是整数型的结果
- 常量可以是常数,也可以是常数计算的表达式
- 根据表达式的结果,寻找匹配的case,并执行case后面的语句,一直 到break为止
switch( type )
{
case 1:
case 2:
System.out.println("你好");
break;
case 3:
System.out.println("晚上好");
case 4:
System.out.println("再见");
break;
default:
System.out.println("啊?说啥?");
break;
}
switch语句可以看作是一种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case (分支标号)处。
分支标号只是说明switch内部位置的路标,在执行完分支中的最后一条语句后,如果后面没有break,就会顺序执行到下
面的case里去,直到遇到一个break,或者switch结束为止。
2.4 判断语句常见错误
问题 | 分析/解决 |
---|---|
忘了大括号,缩进对java无意义 | 永远在if和else后面加大括号,即使只有一句话 |
if后面加分号 | if语句结束了 |
错误使用==和= |