第三章:选择
一.多分支if-else语句和switch语句
1.if-else语句
当if中条件不满足时,则执行else中语句。
grade=65;
if(grade>=85)
level='A';
else if(grade>=75)
level='B';
……
else
level='D';
上例中else if中条件不用写成else if(grade<85&&grade>=75),因为上一条件不符合自动取反面的集合。
2.switch语句
语法:
switch(常量表达式){
case 值1:
//常量1对应的语句1;
break;
case 值2:
//常量2对应的语句2;
break;
……
default:
//以上条件都不符合时执行的语句
}
注意:
- switch必须要能计算出一个char、byte、short、int或String类型的值
- 直到遇到一个break语句或到达该switch语句的结束
- 默认情况下default语句是可选的
- 关键字break是可选的,当遇到break语句时,会立刻终止switch语句
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:day=31;break;
case 4:
case 5:
case 6:
case 9:
case 11:day=30;break;
}
上例展示的是如果月份为1,3,5,7,8,10,12月,则天数为31,否则天数为30。
当需要用条件来判断时,使用if-else语句,当判断一个常量,如数字,字符等用switch语句。
二.常见的错误和陷阱
1.忘记必要的括号
if(x>5){
else{}
2.在if行出现错误的分号
if(x>5);
{
//语句
}
//相当于
if(x>5){}
{
//语句
}
3.对布尔值的冗余测试
boolean b=true;
if(b==true){
//语句
}
//上面的可以改写为
if(b){
//语句
}
4.悬空else出现的歧义,else总是与它最近的if字句匹配
if(x>5)
//语句1
else
if(x<2)
//语句2
else//此else其实与最近的if匹配
//语句3
5.两个浮点数值的相等测试
对于一个非常小的值epsilon,当|x-y|<epsilon时,那么x和y非常接近,将epsilon的值设置为10^-14来比较两个double类型的值,而设为-7此来比较两个float类型的值。
6.简化boolean变量赋值
boolean b;
if(num%2==0){
b=true;
}
else
b=false;
//可以简化为
boolean b=num%2==0;
三.逻辑运算符
1.&&与||
他们都是懒惰操作符,就&&而言,如果&&之前条件为假,那么它将不会判断&&之后条件,之前条件如果为真则要判断后面条件,||同理。
(3>5)&&(6>4)//3>5已经为假,不会判断后面的6>4
(9>6)||(4<3)//9>6已经为真,不会判断后面的4<3
2.&&、||与&、|的区别
可以理解为&和|为“勤劳”操作符,就&而言,无论&之前条件是否为真,都会执行&之后条件,|同理。
int i=1;
System.out.println(3>5&i++>1);//false
System.out.println(i);//2
四.操作符的优先级和结合规则
二元操作符都是左结合的,赋值操作符都是右结合
a-b+c-d=((a-b)+c)-d;//左结合
//当x=y=z=1时
x=y+=c=5
//相当于x=(y+=(c=5)),结果:x=6,y=6,z=5
五.产生随机数
1.产生随机数用到的方法是Math.random()。因为Math类中的方法都是静态的,所以不用创建实例调用它的方法。
2.Math.random()方法的取值范围是[0.0,1.0)。注意:不包含1.0
3.产生随机数的几个小技巧
- 产生n以内的随机数(不包含n):Math.random()*n,包含时乘(n+1)
- 产生n以内的随机整数(不包含n):(int)(Math.random()*n),包含时乘(n+1)
- 产生大于等于a小于b的随机整数时:(int)(Math.random()*(b-a))+a
Math.random()*10;//10以内的随机数,不包括10
(int)(Math.random()*10);//10以内的随机整数,不包括10
(int)(Math.random()*40)+10;//10-50之间的随机整数,不包括50
六.条件表达式
java中唯一一个三元操作符?和:同时出现
February=(year%4==0&&year%100!=0||year%400==0)?29:28;
此例展示的是二月的天数,由?分隔开,问号前为条件,条件为真则执行冒号前面的,否则执行冒号后面的。
七.总结
通过第三章的学习,我学习到了if-else和switch运用的不同场景和使用规则,掌握了可以避免出现的错误和陷阱,明白了逻辑操作符以及与其他操作符之间的优先级,最后学会了产生随机数的方法和技巧。
加油!第四章待更……