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

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

原文地址:https://www.cnblogs.com/JZQT/p/3802443.html