2012-12-13 41 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

我懷疑這一點。你可以在ideone上發佈可運行的代碼嗎? –

+1

請注意,另外在'INVALID_CHARS'中使用複數形式會讓人懷疑這是否是一個充滿無效字符的字符串,並且您是否不想要類似'find_first_of'的東西。 – PlasmaHH

+0

返回find的類型是size_t。 – Chubsdad

回答

9

std::string::find返回std::string::npos它是std::string::size_type類型,它被定義爲一個實現定義的無符號整數。無符號整數永遠不會小於0

您應該始終與std::string::npos進行比較,以檢查std::string::find是否找到了某種東西。

+0

好吧,我會這麼做的,我想你是對的,但是如果npos是無符號類型的,那麼在運行第一行之後'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當它找不到請求的項目。根據標準(§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 intint,所以促銷規則和unsigned int轉換爲int;正如我們之前所見,npos的簽名等價物總是-1,所以這返回true