Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1260721
  • 博文数量: 264
  • 博客积分: 10772
  • 博客等级: 上将
  • 技术积分: 2325
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-25 11:54
文章分类

全部博文(264)

文章存档

2012年(4)

2011年(51)

2010年(31)

2009年(57)

2008年(51)

2007年(70)

分类: C/C++

2007-12-20 00:12:04

 

/*这一系列文章《C++ Tips》是公司Code Committee专家会推荐工程师看的,感觉很好,拿出来与大家共同提高。并不是知道多少会使人与人产生差别,真正的差别在于你能做到多少。

--coofucoo
*/ 

||&&的语句执行顺序
条件语句中的这两个“与”和“或”操作符一定要小心,它们的表现可能和你想像的不一样,这里条件语句中的有些行为需要和说一下:
   express1
││ express2
先执行表达式express1如果为“真”,express2将不被执行,express2仅在express1为“假”时才被执行。因为第一个表达式为真了,整个表达式都为真,所以没有必要再去执行第二个表达式了。
   express1 && express2
先执行表达式express1如果为“假”,express2将不被执行,express2仅在express1为“真”时才被执行。因为第一个表达式为假了,整个表达式都为假了,所以没有必要再去执行第二个表达式了。于是,他并不是你所想像的所有的表达式都会去执行,这点一定要明白,不然你的程序会出现一些莫明的运行时错误。
例如,下面的程序:
if ( sum > 100 &&( ( fp=fopen( filename,"a" ) ) != NULL ) {
  fprintf(fp, "Warring: it beyond one hundred\n");
  ......
}
fprintf( fp, " sum is %id \n", sum );
fclose( fp );
本来的意图是,如果sum > 100 向文件中写一条出错信息,为了方便,把两个条件判断写在一起,于是,如果sum<=100时,打开文件的操作将不会做,最后,fprintffclose就会发现未知的结果。再比如,如果我想判断一个字符是不是有内容,我得判断这个字符串指针是不为空(NULL)并且其内容不能为空(Empty),一个是空指针,一个是空内容。我也许会这样写:
if ( ( p != NULL ) && ( strlen(p) != 0 ))
于是,如果pNULL,那么strlen(p)就不会被执行,于是,strlen也就不会因为一个空指针而“非法操作”或是一个“Core Dump”了。记住一点,条件语句中,并非所有的语句都会执行,当你的条件语句非常多时,这点要尤其注意。

阅读(1154) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~