带有if条件的vector :: size()的奇怪行为

时间:2013-12-12 06:00:16

标签: c++

我有以下代码段:

cout << indexCoveredA[a.size()-1] << " "<< b.size()-1 << endl;
if (indexCoveredA[a.size()-1] < (b.size() - 1) ) {
  cout << "entered";
}

其中abindexCoveredAindexCoveredBstd::vector<int>

当我运行此代码时,控制台会打印:

-1 4

这意味着在if条件下,LHS小于RHS。但是,不会打印“输入”,这意味着if条件被评估为false。

现在,如果我将条件更改为(indexCoveredA[a.size()-1] + 1 < b.size() ),则会在控制台中打印“已输入”。

我已经尝试过使用MSVC和minGW编译器。我无法理解为什么会这样。

有人可以解释一下吗?

感谢。

1 个答案:

答案 0 :(得分:6)

indexCoveredA[]的类型为int,但b.size()的类型为无符号类型(无论size_t是什么,可能是unsigned int或{{ 1}})。

结果,此比较作为无符号比较执行。作为无符号数字,unsigned long long看起来比-1大得多。

您可以尝试使用此示例向自己演示:

4

这会打印#include <iostream> int main() { int i = -1; unsigned u = 4; if (i < u) { std::cout << "less" << std::endl; } else { std::cout << "not less" << std::endl; } }

如果我使用G ++编译并启用了警告,我会收到以下警告,提示问题:

not less

您可能会为编译器启用警告。