if语句本身没有什么好讲的,无非就三种形态:
1、
if(条件){
}
2、
if(条件){
}else{
}
3、
if(条件){
}else if(条件){
}else{
}
值得探讨的是if语句的效率问题,在代码量小的时候,这个问题可以忽略,但是在代码量大的时候,这个问题就值得深究了,提高if语句效率要注意以下几点:
- &&:第一个条件为true,才算第二个
- ||:第一个为false,才算第二个
- if(条件),while(条件):如果&&,尽量把可能是假的条件写到第一个去,||条件尽量把可能为true的条件写到第一个
- 尽量不使用独立的if语句,尽量使用if else或if else if
案例一
输入一个分数,要求分数在0-100之间,判断成绩是否及格
写法1:
Scanner in = new Scanner(System.in);
int score; // 分数
// 输入
System.out.println("输入一个分数:");
score = in.nextInt();
// 合法性判断
if (score > 100 || score < 0) {// 大于100的情况多些
System.out.println("分数非法!");
} else {
if (score >= 60) {
System.out.println("及格!");
} else {
System.out.println("再努力!");
}
}
在写法1中,if语句的条件放的位置是由讲究的,score > 100 放在score < 0前面是因为输入数字的时候大于100的情况更多,在||的情况下,第一个条件对了,就不会去算第二个,因此会减少计算量,从而提高if语句的效率。
写法2:
if (score <= 100 && score >= 0) {
if (score >= 60) {
System.out.println("及格!");
} else {
System.out.println("再努力!");
}
} else {
System.out.println("分数非法!");
}
在写法2中,score <= 100放在score >= 0前面,是因为输入数字的时候小于100的情况更少,毕竟 score >= 0的情况更加多,如果score <= 100不满足,立马就走else语句体,而不会是先满足 score >= 0再不满足score <= 100才走else语句体。
写法3:
if (score <= 100 && score >= 0) {
if (score >= 60) {
System.out.println("及格!");
} else {
System.out.println("再努力!");
}
}
if (score > 100 || score < 0) {
System.out.println("分数非法!");
}
说实话,写法3是最愚蠢的方法,本意上与写法2无异,但这里是两个独立的if语句,至少要判断两次,绝对的影响效率
案例二
输入三个整数,按从小到大的顺序输出
写法1:
Scanner in = new Scanner(System.in);
int a, b, c;
System.out.println("输入三个整数:");
a = in.nextInt();
b = in.nextInt();
c = in.nextInt();
if (a >= b && b >= c) {
}
if (a >= c && c >= b) {
}
if (b >= a && a >= c) {
}
if (b >= c && c >= a) {
}
if (c >= a && a >= b) {
}
if (c >= b && b >= a) {
}
说实话,这是最蠢的写法,同理,因为这个6个独立的if语句,所以最少要判断6次
写法2:
if (a >= b && b >= c) {
} else if (a >= c && c >= b) {
} else if (b >= a && a >= c) {
} else if (b >= c && c >= a) {
} else if (c >= a && a >= b) {
} else {
}
这种if else if的写法是提高效率的最好的方法,这种写法,判断最少1次,最多5次,平均3次,省事,多好。
案例三
输入一个整数,判断该整数是否能被3、5、7整除的情况
最佳写法:
Scanner in = new Scanner(System.in);
int num;
System.out.println("输入一个整数:");
num = in.nextInt();
// 判断顺序:从3-2-1-0:从严格到宽松
// 多条件尽可能从大到小
if (num % 7 == 0 && num % 5 == 0 && num % 3 == 0) {
} else if (num % 7 == 0 && num % 5 == 0) {
} else if (num % 5 == 0 && num % 3 == 0) {
} else if (num % 7 == 0 && num % 3 == 0) {
} else if (num % 3 == 0) {// 一个整除,最好是从小到大
} else if (num % 5 == 0) {
} else if (num % 7 == 0) {
} else {
}
这个案例最容易出错的地方是不注意条件的判断顺序,判断顺序为什么是从3-2-1-0这样子排列,因为例如反过来的话,满足了一个num % 3 == 0,程序就不会往下走了直接输出结果,但事实上还可能还存在着num % 7 == 0 && num % 3 == 0或者num % 5 == 0 && num % 3 == 0或者num % 7 == 0 && num % 5 == 0 && num % 3 == 0这三种情况,所以是考虑不周全,无关效率。
关乎效率问题的在3个条件或者2个条件中,为什么是数字大的放在前面,例如,为什么是num % 7 == 0 && num % 5 == 0 && num % 3 == 0而不是num % 3 == 0 && num % 5 == 0 && num % 7 == 0?原因很简单,前面都说了在&&情况下,情况少发生的就放在前面,num % 7 == 0相对num % 3 == 0更少发生,所以如果第一个条件不满足,就不会去算第二个条件,减少计算量,直接走下一个else if语句。
而单个条件判断,最好从小到大,因为小的满足的情况更多,一旦满足了,就不会走下一个else if语句,减少计算量,从而提高效率。
归根到底,是算法问题,怎样让程序做个更快更好,算法很重要,目前接触到的算法不多,以后再详细探讨。