2012-12-13 2 views
1

이 코드에는 문제가 있지만 그 원인을 찾을 수 없습니다.C++ 비교 표현 버그

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 
    ... 
} 

왜 두 번째 줄에서 결과가 거짓입니까? 내가 보지 못하는 것이 있습니까?

+0

나는 그것을 의심합니다. 이상적인 곳에 실행 가능한 코드를 게시 할 수 있습니까? –

+1

추가적으로'INVALID_CHARS'에 복수형을 사용하는 것은 이것이 잘못된 문자들로 가득 찬 문자열인지 그리고'find_first_of'와 같은 것을 원하지 않는지 궁금하게 만듭니다. – PlasmaHH

+0

find의 리턴은 size_t 타입입니다. – Chubsdad

답변

9

std::string::findstd::string::size_type의 구현이 정의 된 부호없는 정수인 것으로 정의 된 std::string::npos을 반환합니다. 부호없는 정수는 0보다 작지 않습니다.

std::string::find이 무언가를 발견했는지 확인하려면 항상 std::string::npos과 비교해야합니다.

+0

좋아, 내가 할거야, 그리고 네 권리를 짐작 하겠지만, npos가 unsigned 타입이라면, 첫 번째 줄을 runnning 한 후에'pos'는 어떻게 값을 '-1' 했는가? – Erandros

+0

@Erandros'size_t p1 = -1; int p2 = p1; std :: cout << p1 << "p2;'이 코드를 실행하여 – user93353

+0

을 참조하십시오. 부호없는 정수를 사용하면'((name.find (INVALID_CHARS) == -1)'이''true '와 비교되는 이유는 무엇입니까? ? – TeaOverflow

2

std::string::find 요청한 항목을 찾지 못한 경우 std::string::npos을 반환합니다.

static const size_type npos = -1; 

그러나 string::size_type 보통 unsigned int 것을 볼; 표준에 따르면 (21.4/5 §) 이는 -1이 부호없는 동등한 것으로 변환됨을 의미합니다. 일반적으로 0xFFFF는 unsigned int의 최대 값입니다. 두 번째 줄에

:

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

unsigned int 값을 비교하는 (0xFFFF의를 0), 그래서 이것은 false를 반환합니다. 반면에, 당신의 네 번째 줄에 :

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

당신은 unsigned intint, 그래서 프로모션 규칙이 적용하고 unsigned intint로 변환; 앞에서 보았 듯이 npos의 부호가있는 equivalency는 항상 -1이므로 true을 반환합니다.