zoukankan      html  css  js  c++  java
  • 编程错误集锦(长期更新)

           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++中这样的结果是先得到整数除法的结果再把结果强转为浮点数,这样导致了数据的错误,应该首先将其中整数强制转换为浮点数,这样才会进行浮点数的运算从而得到正确的浮点数结果,避免了数据的错误。

  • 相关阅读:
    【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入
    【2018.04.27 C与C++基础】关于switch-case及if-else的效率问题
    【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一
    March 11th, 2018 Week 11th Sunday
    March 10th, 2018 Week 10th Saturday
    March 09th, 2018 Week 10th Friday
    March 08th, 2018 Week 10th Thursday
    March 07th, 2018 Week 10th Wednesday
    ubantu之Git使用
    AMS分析 -- 启动过程
  • 原文地址:https://www.cnblogs.com/JZQT/p/3802443.html
Copyright © 2011-2022 走看看