一个帖子引发的思考

背景

@ mirroatl187发帖问
unsigned int val = 20;
int test = val - 40 > 0 ?1:0;
的test值为什么是1?

我回答:
1. unsigned int 减去 int,先会把int提升为unsigned int,得到结果是 unsigned int
2. unsigned int 和 int 进行比较,会把int 提升为unsigned int
这里有2处类型提升。很明显,任何一个非零的无符号数都比0大

过了会儿,@worldy质疑第一条:

1. unsigned int 减去 int,先会把int提升为unsigned int,得到结果是 unsigned int
这个说法不准确,实际测试,unsigned和非unsigned数减比它大的数都是负数,只是放在 ? :运算中会进行这样转换

我看了之后,希望他把测试代码贴出来,他的测试代码如下:
void CMyTestPrj2View::OnTestTypeTrans()
{
unsigned int a1=60;
int a2=60;

int c=(a2-80)>0 ? 1:0;
int d=int((a1-80))>0 ? 1:0;
int d1=a1-80>0?1:0;
int e=a1-80;
int f=a2-80;
}

类型提升

我现在认真回复下。
对于“实际测试,unsigned和非unsigned数减比它大的数都是负数,只是放在 ? :运算中会进行这样转换”

 val - 40 > 0 ?1:0;结果为1,那么说明val-40>0为真,即val-40>0。
我想反问,如果val-40是负数,val-40怎么会大于0?
如果val-40的结果不是无符号数,又怎么会进行 这样转换 ”?

再来看测试代码,@worldy说
减完之后肯定要赋给int,赋给unsigned一点意义都没有!

赋给unsigned确实没有意义,但是赋给int也一样没有意义,因为,不管事unsigned还是int类型,赋给int之后都是int了。因此,他看到的结果e,f都是-20,从而有了上面的“unsigned和非unsigned数减比它大的数都是负数”。

尽管如此,我还是没有证明我的观点。下面我就来证明下,帖子是发在c++论坛里的,我就用c++来验证
#include <iostream>

using namespace std;

int main()
{
    unsigned int a = 60;
    int b = 60;
    int c = 80;

    if (b - c > 0)
    {
        cout << "有符号数60-有符号数80>0" << endl;
    }
    else
    {
        cout << "有符号数60-有符号数80<0" << endl;
    }

    if (a - c > 0)
    {
        cout << "无符号数60-有符号数80>0" << endl;
    }
    else
    {
        cout << "无符号数60-有符号数80<0" << endl;
    }
    return 0;
}

我用g++ 4.7.1版本的结果是

有符号数60-有符号数80<0
无符号数60-有符号数80>0

因此结果是:unsigned int 减去 int,先会把int提升为unsigned int,得到结果是 unsigned int
其实书上也写明白了,我就不去查那本书了,因为书本也没有铁证的实验结果靠谱。

思考

由于我未能及时回复,我写这文章时,已经结完贴了,从给分来看,帖主是有被误导了。我突然想起了@陈硕 大哥的话,
“不上论坛最好。
作为初学者,你如何判断论坛上的回答是对还是错?
如何判断回答问题的人的水平比你高还是比你低?
如何判断他是真懂还是道听途说、人云亦云?”

现在看看,确实有几分道理。即使回答人的水平比你高,你还是判断不出来他说的是对是错。
记录在此,希望大家引以为戒!


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值