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

Abh*_*sal -1 c++

我有以下代码片段:

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

其中a,b,indexCoveredAindexCoveredBstd::vector<int>.

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

-1 4
Run Code Online (Sandbox Code Playgroud)

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

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

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

有人可以解释一下吗?

谢谢.

Joe*_*e Z 6

类型indexCoveredA[]int,但是类型b.size()是无符号类型(无论size_t是什么,或者是unsigned int或者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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这打印not less.

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

x.c: In function ‘int main()’:
x.c:8: warning: comparison between signed and unsigned integer expressions
Run Code Online (Sandbox Code Playgroud)

您可能会为编译器打开警告.