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