在公司接收了前辈的shi山代码,改Bug时发现一个很有意思的东西,源代码大概如下:
unsigned int cups[40];
...
memset(cups,14500,80);
...
if(...) cup[i]=-1;
...
switch(cup[i])
{
...
case -1:
..}
首先定义了一个无符号数组cups,memset初始化,1400的参数也不知道何处而来,80我觉得是错的,按字节大小算,怎么也得是160,OKFine,这边不管。但出现某种情况时,给当前杯位赋-1,由于是无符号数,我觉得这边不对,查了下资料,果然,由于越界,此处的cup会被赋予当前类型的最大值4294967295,既然这样,那下面的swich语句永远不会生效,可是软件却可以正常使用??what fu*k
不信邪了,写了个小demo:
unsigned int a1=0;
qDebug()<<"a = "<<a1;
a1=-1;
qDebug()<<"a = "<<a1;
qDebug()<<"a = -1 ? "<<(a1==-1);
if(a1==-1) qDebug()<<"nb";
switch(a1){
case -1:
qDebug()<<"nb2";
}
打印输出如下:
a = 0
a = 4294967295
a = -1 ? true
nb
nb2
震惊,居然过了。 查了下,原来-1也会发生隐式转换。 好吧,果然前辈的代码跑起来就别去乱动了。
附上Ai回答,当然事实证明,ai是错的。
在C++中,当你执行cout << (a == -1)
,并且a
是一个unsigned int
类型的变量,且之前被赋值为-1
(实际上,赋值操作会将-1
隐式转换为unsigned int
类型的UINT_MAX
),那么表达式(a == -1)
的结果将是false
。
原因是,在比较unsigned int
类型的a
和int
类型的-1
时,-1
会被隐式转换为unsigned int
类型的UINT_MAX
(这是因为在C++中,较小的整数类型会向较大的整数类型进行隐式转换,并且无符号整数类型总是被视为大于或等于零)。但是,由于a
本身就已经是UINT_MAX
(之前通过赋值-1
得到),所以a
并不等于字面量-1
(在unsigned int
的上下文中),而是等于UINT_MAX
。
因此,(a == -1)
这个表达式的求值结果是false
,并且当你使用cout
输出这个布尔值时,它会被转换为整数0
(在C++中,false
通常被表示为0
,而true
被表示为1
)。
所以,cout << (a == -1);
的输出将是0
。