零,先总结:
1、if 语句适用于 按区域进行判断的情形
2、switch 适用于离散值进行判断的情形
3、
一、if 条件语句中要注意的
0、if 条件语句中,真值true 用非0表示;false 用0表示
1、bool 型变量应该直接出现于条件中,不要进行比较;原因是,bool值是由不同的编译器厂商自行定义的;它的值有可能是-1,也有可能是1 或其他,所以bool的真值是一个不确定的数,所以不要让bool型变量和其他值比较,直接用就好
2、工程开发上,约定俗成的,把0 或其他常数写在==左边;这样做主要是防止手误把 == 写成=
3、float型变量不能直接进行0值比较,需要定义精度;eg
#define EPSINON 0.000000001
float f = 0.0
if( (-EPISON <= f) && (f <= EPISON)) //把f锁定在无限接近0的一个区间内
{
.....
}
{
.....
}
P.S. 扩展,事实上,当浮点型变量和任意一个常数比较时,最好也是以区间+精度的形式来表示,eg :
#define EPSION 0.00000001
float f = 5.0;
if( ( 5 - EPSION=<f) && ( f >= 5 + EPSION) )
{
}
二、多路分支 switch
1、语法
(1)case语句中的值只能是整型或字符型
(2)为了方便日后程序的维护和可读性,通常将case语句中的常量 按:字母或数字顺序排列
(3)default 语句必须有用于处理默认情况
2、switch 语句的缺点
(1)由于case语句只能是常量,所以当条件是一个范围的时候,switch 语句就失效了。此时只能用if
================================================================================
循环语句
零,先总结:
1、do 语句先执行后判断,循环体至少执行一次
2、while 语句先判断后执行,循环体可能不执行
3、for 语句先判断后执行,相比while跟简洁
一、do while 的妙用,使用do while 来统一一段代码的出口(且保证该代码一定能从此出口出去)
1、样例1、
int func( int n )
{
int i = 0;
int * p = (int * )malloc(sizeof(int)*n);
if(NULL == p) return 0;
if(n < 0) return 0;
//do something here
//.........
free(p)
return 1;
}
样例1有两个问题
(1)函数出口太多(多个return),不简洁
(2)内存泄露;考虑情况,当n < 0时,由于malloc 支持负数(malloc认为负数是一个极大的数,因为他的形参是:unsigned int),所以P != NULL。这种情况就会产生内存泄露了。
2、样例2
int func( int n )
{
int i = 0;
int * p = (int * )malloc(sizeof(int)*n);
do
{
if(NULL == p) break;
if(n < 0) break;
//do something here
//.........
}while(0);
free(p)
ret = 1;
return 1;
}
分析这样做的好处
1、使用do while(0) +break,保证函数的出口只有一个,且所有分支必须要通过此出口,这样不但函数形式简洁,且也保证了 free函数一定会执行,防止内存泄露