• 编程错误集锦(长期更新)


           1.使用标准库快排函数时浮点数的比较

     1 //错误样例
     2 int Mycmp(const void *a, const void *b)     
     3 {
     4     return *(double *)a - *(double *)b;
     5 }
     6 
     7 //正确样例
     8 int Mycmp(const void *a, const void *b)     
     9 {
    10     if (*(double *)a > *(double *)b)
    11     {
    12         return 1;
    13     }
    14     return -1;
    15 }

           解释:标准库里的快排函数中的自定义比较函数的返回值类型为int。错误样例中的函数定义返回类型为int,而实际返回类型为double,这样会造成将double类型的数据赋值给int类型的数据的效果,也就是数据丢失。浮点型赋值给整型时小数位的数据会丢失并且不会进行四舍五入,所以0.9赋值给int类型的数据时int类型得到的值为0。


           2.使用if语句进行变量值的判断

     1 //错误样例
     2 if (x = 5)      //普通写法
     3 {
     4     //Do something;
     5 }
     6 
     7 if (5 = x)      //好的写法
     8 {
     9     //Do something;
    10 }
    11 
    12 //正确样例
    13 if (x == 5)     //普通写法
    14 {
    15     //Do something;
    16 }
    17 
    18 if (5 == x)     //好的写法
    19 {
    20     //Do something;
    21 }
           解释:当我们需要写“==”符号时却写成了“=”是一种十分常见的编程失误。但是有一种技巧性写法可以让我们更容易发现此类错误。那就是把常量值写在左边,变量写在右边。很明显好的写法中的错误样例编译不会通过,因为赋值运算符的左值不能为常量或表达式,而普通写法的错误样例编译却可以通过,这样的错误不容易被发现。

           3.整型数做除法的值赋给浮点数

    //错误样例
    double aver;
    int sum, n;
    aver = sum / n;
    //或者
    aver = sum / 10;
    
    //正确样例
    double aver;
    int sum, n;
    aver = (double)sum / n;
    //或者
    aver = sum / 10.0;

           解释:当我们使用整数之间的除法想要得到浮点数这样的结果,很容易直接把整数除法的结果赋给浮点数,事实上在C/C++中这样的结果是先得到整数除法的结果再把结果强转为浮点数,这样导致了数据的错误,应该首先将其中整数强制转换为浮点数,这样才会进行浮点数的运算从而得到正确的浮点数结果,避免了数据的错误。

  • 相关阅读:
    SQL注入方法之:获取列名
    手把手教会你模拟退火算法
    我的G++编译选项
    编译器优化误解程序员的意思
    ZKW线段树
    扩展欧几里得算法
    快速幂
    乘法取模
    莫队算法良心讲解
    高精度模板
  • 原文地址:https://www.cnblogs.com/JZQT/p/3802443.html
Copyright © 2020-2023  润新知