在将项目从vc ++ 6.0迁移到vs 2008时,我收到以下警告。有人可以解释一下为什么会出现这种警告吗?
inline tstring& tstring::trim()
{
long lDelFront = 0, lDelBack = 0;
while (lDelFront < length() && at(lDelFront) == ' ') //C4018 Warning
lDelFront++;
if ( lDelFront > 0 )
{
erase(0, lDelFront);
}
while (lDelBack < length() && //C4018 Warning
at(length() - lDelBack - 1) == ' ')
lDelBack++;
if ( lDelBack > 0 )
{
erase(length() - lDelBack, lDelBack);
}
return *this;
}
谢谢! Ankush
答案 0 :(得分:4)
length()可能返回size_t或unsigned long,并且您将它与signed long进行比较。 改变
long lDelFront = 0, lDelBack = 0;
到
size_t lDelFront = 0;
size_t lDelBack = 0;
避免签名/未签名比较
答案 1 :(得分:4)
这个问题没有提供足够的背景,特别是缺少length()
的原型。我们知道long
是有符号整数(请参阅here),我们可以从警告中猜出length()
返回无符号整数。
您不能只比较有符号和无符号整数,并期望得到明智的结果。这是因为当您比较有符号或无符号数时,符号位(“最左侧”位)的解释会有所不同。例如:
signed char c1 = 0x80; // that's a -127 decimal
unsigned char c2 = 0x80; // that's a 128 decimal
如果您对这些数字执行大于或小于比较并混合签名,则不清楚如何比较这些值,因为两者中的每一个的结果都不同。 (注意,对于相等/不相等的比较,这不会发生。)例如:
bool greater = c1 > 0; // false, because 0x80 interpreted as signed number is negative
bool greater = c2 > 0; // true, because 0x80 interpreted as unsigned number is positive
编译器会告诉您有关此问题的问题。有关此警告的更多详细信息,请here。
修复警告的正确解决方法是将long
更改为unsigned long
,以匹配length()
函数的返回类型。
答案 2 :(得分:0)
C ++无法比较两种不同的类型,因此它将它们转换为相同的类型。将signed更改为unsigned会更改负数的值。
unsigned u = 10;
int i = -1;
if (u > i)
DoSomething();
要对这些进行比较,它可能会将i
更改为无符号,这会给我们10 > 4294967295
,这可能让您大吃一惊