背景
@ mirroatl187发帖问
unsigned int val = 20;
int test = val - 40 > 0 ?1:0;
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大
2. unsigned int 和 int 进行比较,会把int 提升为unsigned int
这里有2处类型提升。很明显,任何一个非零的无符号数都比0大
过了会儿,@worldy质疑第一条:
1. unsigned int 减去 int,先会把int提升为unsigned int,得到结果是 unsigned int
这个说法不准确,实际测试,unsigned和非unsigned数减比它大的数都是负数,只是放在 ? :运算中会进行这样转换
这个说法不准确,实际测试,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 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;
}
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
其实书上也写明白了,我就不去查那本书了,因为书本也没有铁证的实验结果靠谱。
思考
由于我未能及时回复,我写这文章时,已经结完贴了,从给分来看,帖主是有被误导了。我突然想起了@陈硕 大哥的话,
“不上论坛最好。
作为初学者,你如何判断论坛上的回答是对还是错?
如何判断回答问题的人的水平比你高还是比你低?
如何判断他是真懂还是道听途说、人云亦云?”
作为初学者,你如何判断论坛上的回答是对还是错?
如何判断回答问题的人的水平比你高还是比你低?
如何判断他是真懂还是道听途说、人云亦云?”
现在看看,确实有几分道理。即使回答人的水平比你高,你还是判断不出来他说的是对是错。
记录在此,希望大家引以为戒!