前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >耐人寻味的逻辑错误

耐人寻味的逻辑错误

作者头像
Qt君
发布2020-07-21 10:08:40
5560
发布2020-07-21 10:08:40
举报

源于Qt交流群的一名群友提问,一段非常容易出错的代码。

场景

  逻辑代码如下:

int a = -20;
unsigned int b = 10;

if ((a+b) > 0) {
    printf("a + b > 0 \n");
}
else {
    printf("a + b < 0 \n");
}

相信大家都会毫无疑问认为a + b的值为-20+1010小于0,那么打印输出的是:

a + b < 0

  其实不然,运行代码后最终打印的输出是:

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

总结

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 场景
  • 猜测
  • 引申
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档