源于Qt交流群的一名群友提问,一段非常容易出错的代码。
场景
逻辑代码如下:
int a = -20;
unsigned int b = 10;
if ((a+b) > 0) {
printf("a + b > 0 \n");
}
else {
printf("a + b
}
相信大家都会毫无疑问认为a + b的值为-20+10得10小于0,那么打印输出的是:
a + b
其实不然,运行代码后最终打印的输出是:
a + b > 0
是不是觉得很奇怪呢?怎么会是这样的结果。君君也尝试找出答案,以下均为猜测,仅供参考。
猜测
上面代码有一个可疑点就是:(a+b) > 0的判断中a和b的类型都不相同。我们也没有做出强制转换后再比较的操作,那么就猜测它(a + b)中由编译器执行的强制转换导致的。
a为整型,b为无符号整型,那么君君猜测(a + b)中的a被强制转换为无符号整型了,由于a为负数,在转换为无符号整型过程中发生溢出,其值应该是:UINT_MAX - 20 + 1。
那么
if ( (a + b) > 0)
可以看成
if ( (UINT_MAX - 20 + 1 + 10) > 0)
由此得出上面代码运行是正确输出:a + b > 0的。
引申
下面两个片段是不是和上面的代码逻辑似曾相识呢。
代码片段1:
float f = 1/2;
printf("%f\n", f);
打印输出:
0.000000
代码片段2:
float f = 1/2.0;
/* 或 float f = 1.0/2; */
printf("%f\n", f);
打印输出:
0.500000
总结
我们应该避免隐式的类型转换,赋值等操作。
领取专属 10元无门槛券
私享最新 技术干货