为什么这个条件与string.length()的条件不一致?

时间:2017-04-29 02:57:15

标签: c++ c++11

int main()
{
    std::string string = "hi";

    std::cout << "Enter index: ";
    int index;
    std::cin >> index;

    if(index < string.length())
        std::cout << index << " is less than " << string.length();
    else
        std::cout << index << " is greater than " << string.length();
}

字符串长度为2.当我输入负数时,例如-3,if语句的计算结果为false,并执行else语句&amp; print -3大于2 。如果我输入一个仍然小于字符串长度的正数,比如1,if语句的计算结果为true&amp; print 1小于2

问题:

因此,虽然-3和1都是小于string.length()的数字,但为什么只有1评估为true而-3不在if语句中?

2 个答案:

答案 0 :(得分:2)

intunsigned int进行比较时,int会转换为unsigned int。因此,如果它之前是负值,它就会变成一个非常大的正整数。这就是为什么它变得大于字符串的大小。

尝试这样做:

 unsigned int x = 100;
 int y = -1;

 std::cout << (x < y? "Yes" : "No" << std::endl; //prints Yes

 std::cout << static_cast<unsigned int>(y) << std::endl; //prints big +ve number

请注意,std::string::size()std::string::length()都返回std::string::size_type,它只是某些 unsigned整数类型的别名,可能是{{} 1}},unsigned intunsigned long(通常是某些size_t整数类型的别名)。

答案 1 :(得分:1)

试试这个

因为.length或.size是unsigned int,所以常规int会自动转换。将它存储在int数据类型的变量中,这应该可以解决您的问题。

int main()
{
    std::string string = "hi";

    std::cout << "Enter index: ";
    int index;
    int length = string.size();
    std::cin >> index;

    if(index < length)
        std::cout << index << " is less than " << string.length();
    else
        std::cout << index << " is greater than " << string.length();
}