Skip to content
AN QIULIANG edited this page Nov 14, 2016 · 1 revision

1.浮点数强制转换陷阱

double d = 0.5;
float f = (float)d;
double d2 = f;
bool b = d == d2;

double d = 0.6;
float f = (float)d;
double d2 = f;
bool b = d == d2;

这里b也false。刚才这个操作如果开始另d等于0.5结果就将会true。乍一看0.6这个数这么短,double和float都肯定能够表示那么转换过去,再转换回来结果理应相等。其实这因为我们用十进制思考困难太久了。如果我们0.6化成二进制小数,可以发现得到结果0.10011001……(1001循环)这一个无限循环小数。因此不管float还double它存储0.6时候都无法完全保存它精确值(计算机不懂分数呵呵)。这样话由于float保存23位,而double保存52位,就造成了double转化成float时候丢失掉了一定数据,再转换回去时候那些丢掉值被补成了0。因此这个后来double和从前double值已经不再一样了。

2.逗号表达式陷阱

int main(void) {  
    int a[3][2] = { (0,1), (2,3), (4,5) } ;  
    int *p ;  
    p = a[0] ;  
    printf(“%d”, p[0] ) ;  
}
void foo(const char **p) {

}
void test(char **p) {
    foo(p);
}

4.sizeof

C语言: sizeof('a') = 4
C++语言:sizeof('a') = 1

5.未定义行为

#include <stdio.h>

int main(void) {
    int x = 10;
    while (0 <---- x) {
        printf("%d ", x);
    }
    return 0;
}
Clone this wiki locally