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编辑过]