2516|0

362

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

如何能编好单片机的程序(11) [复制链接]

27、不要为宏定义加分号
-----------
有许多程序员不知道在宏定义时是否要加分号,有时,他们以为宏是一条语句,应该要加分号,这就错了。当你知道了宏的原理,你会赞同我为会么不要为宏定义加分号的。看一个例子:
  #define MAXNUM 1024;
这是一个有分号的宏,如果我们这样使用:
  half = MAXNUM/2;
  
  if ( num < MAXNUM )
等等,都会造成程序的编译错误,因为,当宏展开后,他会是这个样子的:
  half = 1024;/2;
  
  if ( num < 1024; )
  
是的,分号也被展进去了,所以造成了程序的错误。请相信我,有时候,一个分号会让你的程序出现成百个错误。所以还是不要为宏加最后一个分号,哪怕是这样:
  #define LINE  "================================="
  
  #define PRINT_LINE printf(LINE)
  #define PRINT_NLINE(n) while ( n-- >0 ) { PRINT_LINE; }
  
都不要在最后加上分号,当我们在程序中使用时,为之加上分号,
  main()
  {
    char *p = LINE;
    PRINT_LINE;
  }
这一点非常符合习惯,而且,如果忘加了分号,编译器给出的错误提示,也会让我们很容易看懂的。
28||&&的语句执行顺序
------------
条件语句中的这两个""""操作符一定要小心,它们的表现可能和你想像的不一样,这里条件语句中的有些行为需要和说一下:
  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"了。
记住一点,条件语句中,并非所有的语句都会执行,当你的条件语句非常多时,这点要尤其注意。
此帖出自单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表