在下面的代码中,我不明白为什么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?)
答案 0 :(得分:8)
s.find_first_of("p")
会返回size_t
类型的unsigned
。
>
运算符会在评估-1
之前将s.find_first_of("p")>-1;
转换为无符号类型。这就是C ++的工作原理:如果一个接受两个参数的运算符遇到signed
和unsigned
类型作为那些参数,那么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);
}