注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。
测试环境:Ubuntu 10.10
GCC版本:4.4.5
一、if语句分析
1) if语句用于根据条件选择执行语句
2) else不能独立存在且总是与它最近的if相匹配
3) else语句后可以连接其他if语句(else if)
4) if语句中零值比较的注意点
- bool型变量应该直接出现于条件中,不要进行比较
- 变量和0值比较时,0值应该出现在比较符号左边(写成赋值时,编译器会报错)
- float型变量不能直接进行0值比较,需要定义精度(重点查看)
补充:
浮点数比较时自定义精度,需要注意精度不宜过高,float和double都有有效位数。
gcc4.4.5测试:float为小数点后7位,double为小数点后16位。
vs2015测试:float为小数点后7位,double为小数点后16位。
5) switch语句分析
1、switch语句对应单个条件多个分值的情形
2、case语句分支必须要有break,否则会导致分支重叠
3、default语句有必要加上,以处理特殊情况
4、case语句中的值只能是整型或字符型(为了增加可读性,通常定义成枚举)
5、case语句的排列顺序
- 按字母或数字顺序排列各条语句
- 正常情况放在前面,异常情况放在后面
- default语句只用于处理真正的默认情况
实例分析
if和switch使用示例
6-1.c
#include <stdio.h>
void f1(int i)
{
if(i < 6)
{
printf("Failed!\n");
}
else if(( 6 <= i ) && ( i <= 8 ))
{
printf("Good!\n");
}
else
{
printf("Perfect!\n");
}
}
void f2(char i)
{
switch(i)
{
case 'c':
{
printf("Compile\n");
break;
}
case 'd':
{
printf("Debug\n");
break;
}
case 'o':
{
printf("Object\n");
break;
}
case 'r':
{
printf("Run\n");
break;
}
default:
{
printf("Unknown\n");
break;
}
}
}
int main(void)
{
f1(5); //Failed!
f1(9); //Perfect!
f1(7); //Good!
f2('o'); //Object
f2('d'); //Debug
f2('e'); //Unknown
return 0;
}
操作:
1) gcc 6-1.c -o 6-1.out编译正确,打印结果:
Failed!
Unknown
Good!
Object
Debug
Unknown
2) 修改代码,测试if……else终止行为:
#include <stdio.h>
void f1(int i)
{
if(i < 6)
{
printf("Failed!\n");
}
else if(printf("2\n"), (6<=i)&&(i<=8))
{
printf("Good!\n");
}
else
{
printf("Perfect!\n");
}
}
void f2(char i)
{
switch(i)
{
case 'c':
{
printf("Compile\n");
break;
}
case 'd':
{
printf("Debug\n");
break;
}
case 'o':
{
printf("Object\n");
break;
}
case 'r':
{
printf("Run\n");
break;
}
default:
{
printf("Unknown\n");
break;
}
}
}
int main(void)
{
f1(5); //Failed!
f1(9); //Perfect!
f1(7); //Good!
f2('o'); //Object
f2('d'); //Debug
f2('e'); //Unknown
return 0;
}
gcc 6-1.c -o 6-1.out编译正确,打印结果:
Failed! //f1(5)
2 //f1(9)
Perfect!
2 //f1(7)
Good!
Object
Debug
Unknown
分析:
Failed!打印完毕后,没有打印2。证明:if如果遇到匹配的正确条件,接下来的else if将不会匹配。
编程实验
有趣的角色对换
6-2.c
#include <stdio.h>
void f1(int i)
{
switch(i < 6) //这里的判断更换成条件语句
{
case 1: //逻辑值:真(1)
{
printf("Failed!\n");
break;
}
default:
{
switch(( 6 <= i ) && ( i <= 8 ))
{
case 1: //逻辑值:真(1)
{
printf("Good!\n");
break;
}
default:
{
printf("Perfect!\n");
break;
}
}break;
}
}
}
void f2(char i)
{
if('c' == i)
{
printf("Compile\n");
}
else if('d' == i)
{
printf("Debug\n");
}
else if('o' == i)
{
printf("Object\n");
}
else if('r' == i)
{
printf("Run\n");
}
else
{
printf("Unknown\n");
}
}
int main(void)
{
f1(5); //Failed!
f1(9); //Perfect!
f1(7); //Good!
f2('o'); //Object
f2('d'); //Debug
f2('e'); //Unknown
return 0;
}
操作:
1) gcc 6-2.c -o 6-2.out编译正确,打印结果:
Failed!
Perfect!
Good!
Object
Debug
Unknown
小结:
1) if语句适用于复杂逻辑进行判断的情形中
2) switch语句适用于对离散值进行判断的情形中
3) if语句和switch语句在功能上可以相互替换
4) if语句对于“按片”分支判断的情形更加简洁
5) switch语句对于多分支判断的情形更加简洁