设为首页 加入收藏

TOP

C语言一个微妙的Bug
2014-11-23 20:06:41 】 浏览:6568
Tags:语言 一个 微妙 Bug

  1 #include


  2


  3 int array[] = {23, 24 ,12, 204};


  4 #define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))


  5


  6 void main()


  7 {


  8 int d = -1;


  9 if(d <= TOTAL_ELEMENTS)


  10 printf("TRUE\n");


  11 }


  运行结果是不打印TRUE。


  解释:TOTAL_ELEMENT所定义的值是unsigned int类型,因为sizeof()返回类型是无符号数。if语句在signed int和unsigned int之间测试大小关系,所以d被提升为unsigned int类型。 -1转换成unsigned int 的结果将是一个非常巨大的正整数,导致if判断为假。


  解决方法:可以修改第四行为:#define TOTAL_ELEMENTS (int)(sizeof(array)/sizeof(array[0]))


  建议:


  尽量不要在代码中使用无符号类型,以免增加不必要的复杂性。尤其是,不要仅仅因为无符号数不存在负值(如年龄、国债等)而用它来表示数量。尽量使用int那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界的情况(如-1被转化为非常大的正整数)。


  只有在使用位段和二进制掩码的时候,才可以使用无符号数。应该在表达式中使用强制类型转化,是操作数均为有符号数或者无符号数,避免编译器来选择结果的类型。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇c语言函数用指针传递参数问题 下一篇计算机二级C语言基础:有趣的位运算

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目