zoukankan      html  css  js  c++  java
  • C语言一个微妙的Bug

     1 #include <stdio.h>
     2 
     3 int array[] = {2324 ,12204};
     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被转化为非常大的正整数)。

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

  • 相关阅读:
    node-webkit 笔记
    CEF 相关资料
    输出重定向
    FindProcDLL::FindProc 和 KillProcDLL::KillProc,必须使用WPF x86编译出来的程序
    wpf xaml inlines
    Gradle 笔记
    Android手机的 storage
    SpringMVC 工作原理详解
    SpringMVC 面试题
    18、多线程 (线程安全、线程同步、等待唤醒机制、单例设计模式)
  • 原文地址:https://www.cnblogs.com/younes/p/1641592.html
Copyright © 2011-2022 走看看