关于 if,switch,do while ,for 你不知道的那点小事

零,先总结:

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函数一定会执行,防止内存泄露

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值