首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

耐人寻味的逻辑错误

源于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

总结

  我们应该避免隐式的类型转换,赋值等操作。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200718A0VRPF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券