c ++中的find_first_of给出了不同的值

时间:2016-02-08 16:41:05

标签: c++

在下面的代码中,我不明白为什么b是假的。

string s = "--p--";
cout << s.find_first_of("p") << endl; //prints 2
bool b = s.find_first_of("p")>-1;
cout << b << endl;  //prints 0 (why?)

2 个答案:

答案 0 :(得分:8)

s.find_first_of("p")会返回size_t类型的unsigned

>运算符会在评估-1之前将s.find_first_of("p")>-1;转换为无符号类型。这就是C ++的工作原理:如果一个接受两个参数的运算符遇到signedunsigned类型作为那些参数,那么signed一个转换为unsigned一个。

转换为无符号类型时,

-1将是一个大的正数。 (事实上​​,它将环绕到最大值size_t。)

因此,您的比较评估为false

要检查字符是否不在字符串中,请使用b = s.find_first_of("p") != string::npos;

答案 1 :(得分:3)

std::string::find_first_of()返回值的类型为size_t,而某些无符号类型的返回值为typedef。为了与整数{-1}进行比较,编译器应该产生一个公共类型。根据标准通常的算术转换

  

如果具有无符号整数类型的操作数的等级大于或等于   另一个操作数的类型的等级,带有符号整数类型的操作数应转换为   具有无符号整数类型的操作数的类型。

这意味着,会发生类似的情况:

bool b = s.find_first_of("p")>static_cast<unsigned>(-1);

您可以编译以下简单程序来观察行为。

#include <iostream>

int
main()
{
  int i = -1;
  std::cout << static_cast<unsigned>(i);
}