1

这段代码有问题,但我找不到导致它的原因。

bool Parser::validateName(std::string name) {
    int pos = name.find(INVALID_CHARS);               //pos is -1, 
    bool result = ((name.find(INVALID_CHARS)) < 0);   //result is false
    //That was weird, does that imply that -1 >= 0?, let's see
    result = (pos < 0)                                //result is true
    result = ((name.find(INVALID_CHARS)) == -1)       //result is true
    result = (-1 < 0)                                 //result is true
    ...
}

为什么第二行的结果为假。有什么我没看到的吗?

4

2 回答 2

9

std::string::find返回std::string::npos其类型std::string::size_type被定义为实现定义的无符号整数。无符号整数永远不会小于0

您应该始终比较std::string::npos以检查是否std::string::find找到了某些东西。

于 2012-12-13T15:54:27.087 回答
2

std::string::findstd::string::npos当它没有找到请求的项目时返回。根据标准(§ 21.4/5):

static const size_type npos = -1;

string::size_type通常情况下是这样unsigned int;这意味着将-1转换为其无符号等效项。通常为 0xFFFF,这是unsigned int.

在你的第二行:

bool result = ((name.find(INVALID_CHARS)) < 0);

您正在比较两个unsigned int值(0xFFFF 和 0),因此返回false. 另一方面,在你的第四行:

result = ((name.find(INVALID_CHARS)) == -1)

你有一个unsigned int和一个int,所以促销规则适用并且unsigned int转换成一个int; 正如我们之前看到的,有符号的等值npos总是-1,所以返回true

于 2012-12-13T16:04:11.947 回答