-- 作者:admin
-- 发布时间:2015/10/13 13:07:42
-- [推荐]第三课代码讲义:分支语句
1)if int main() { int grade=95;
if(grade>=90) { printf("A"); } return 0; }
简写: int main() { int grade=95;
if(grade>=90) printf("A");
return 0; }
多条语句不能简写
int main() { int grade=95;
if(grade>=90) { printf("A"); } else { printf("B"); }
return 0; }
int main() { int grade=95;
if(grade>=90) printf("A"); else printf("B");
return 0; }
等价于 int main() { int grade=95;
if(grade>=90) { printf("A"); } if(grade<90) { printf("B"); }
return 0; } 但是显然前者较好,因为后者程序一定要进行两次判断,也就是说,即使第一个条件满足了,程序也要进行第二个条件的判断;而前者不会,一旦判断出条件的真假,就没有必要在作其他的判断了。
对于更多的判断可以使用else if语句,如下例为判断成绩的等级,规则为 90——100:A 80——89:B 70——79:C 0——69:D
int main() { int grade=95;
if(grade>=90 && grade<=100) printf("A");
if(grade>=80 && grade<90) printf("B");
if(grade>=70 && grade<80) printf("C");
if(grade<70 && grade>=0) printf("D");
if(grade<0 || grade>100) printf("Error in Grade!");
return 0; }
int main() { int grade=195;
if(grade>=90 && grade<=100) printf("A"); else if(grade>=80 && grade<90) printf("B");
else if(grade>=70 && grade<80) printf("C");
else if(grade<70 && grade>=0) printf("D");
else if(grade<0 || grade>100) printf("Error in Grade!");
return 0; } 注意:良好的程序嵌套结构和缩进结构有助于写出正确易读的程序,反之容易产生难以发现的逻辑错误。
int main() { int grade=50;
if(grade>=60) if(grade<=100) printf("及格"); else printf("不及格");
return 0; } 提示:程序没有语法错误,但是没有输出,原因在于else子句其实和第二个if配套,虽然感觉和第一个if对齐(编译时会忽略所有的程序缩进空格)
正确写法: int main() { int grade=50;
if(grade>=60) { if(grade<=100) printf("及格"); } else printf("不及格");
return 0; }
2)switch语句 int main() { int i=1; switch(i) { case 0: printf("A"); break; case 1: printf("B"); break; case 2: printf("C"); break; default: printf("Other!"); break; }
return 0; }
注意:如果不使用break,会产生“穿透”效果
和上述的else if多重分支判断语句相比,switch只能判断点的取值,也就是说,不能判断范围,所以上述判断成绩等级的程序不能直接写为: int main() { int grade=100; switch(grade) { case grade>=90 && grade<=100: printf("A"); break; case grade>=80 && grade<90: printf("B"); break; case grade>=70 && grade<80: printf("C"); break; case grade>=0 && grade<70: printf("D"); break; default: printf("Error in Grade!"); break; }
return 0; }
但是可以巧妙的使用取十位数字来进行判断: int main() { int grade=85; switch(grade/10) { case 10: case 9: printf("A"); break; case 8: printf("B"); break; case 7: printf("C"); break; case 6: case 5: case 4: case 3: case 2: case 1: case 0: printf("D"); break; default: printf("Error in Grade!"); break; } return 0; }
这个程序有个小小的bug,你能发现吗?
提示:设置grade为-5看看输出是什么?为什么?
应该重新设计程序: int main() { int grade=5; //check the grade if(grade<0 || grade>100) { printf("Error in Grade!"); return 0;//exit the program }
//process the valid grade switch(grade/10) { case 10: case 9: printf("A"); break; case 8: printf("B"); break; case 7: printf("C"); break; case 6: case 5: case 4: case 3: case 2: case 1: case 0: printf("D"); break; default: printf("Error in Grade!"); break; } return 0; }
还要注意switch不能判断浮点型数据 int main() { double i=1; switch(i) { case 0: System.out.println("A"); break; case 1: System.out.println("B"); break; case 2: System.out.println("C"); break; default: System.out.println("Other!"); break; } return 0; }
程序编译报错:switch quantity not an integer(Java语言为:possible loss of precision) 原因在于浮点型数据的存储值并非是确定的,总是存在精度上的误差,如1.00000000也可以保存为0.99999999,所以,不能直接判断两者是否相等,只能通过相减的差值是否位于一个较小的范围内来判断,所以一般使用else if更为合适
#include <math.h>
int main() { double i=2.0;
if(fabs(i-0)<0.0001) printf("A"); else if(fabs(i-1)<0.0001) printf("B"); else if(fabs(i-2)<0.0001) printf("C"); else printf("Other!");
return 0; }
下面的程序输出会怎样? int main() { double i=1.0; if(i==0.999999999999999999999999999999) { printf("成功!i=%d",i); }
}
int main() { double i=1.0; if(i==0.999999999999999999999999999999) { printf("成功!i=%d",i); }
}
问题:输出是什么? int main() { int i=0; if(i=1) { printf("成功!i=%d",i); }
}
[此贴子已经被作者于2015-10-20 13:04:54编辑过]
|