2016-12-25 82 views
0

下面的代碼打印計數爲0.但是s.length()是11,所以不應該計數爲10011?(C++)for循環正在被跳過

int main() { 
    clock_t start_time = clock(); 
    string s = "hello world"; 
    int count = 0; 
    for (int i = -10000; i < s.length(); i++) { 
     count++; 
    } 
    cout << count << endl; 
    cout << clock() - start_time; 
    return 0; 
} 
+0

嘗試'unsigned int i'而不是'int i'。 –

+0

@barakmanos仍然給出0 – wannabe

+2

['std :: string :: length'](http://en.cppreference.com/w/cpp/string/basic_string/size)返回的類型是* unsigned *。您對已簽名和未簽名整數的比較可能無法按預期工作。 –

回答

0

您正在運行到一個典型的簽署-VS-符號比較失敗 - 對SO的經常問的一個問題(見Comparison operation on unsigned and signed integers的一個例子)。

您可以通過切換到相等的比較,而不是關係比較

for (int i = -10000; i != s.length(); i++) 

的或修復您的代碼強迫簽署整數比較

for (int i = -10000; i < (int) s.length(); i++) 

(儘管在後一種情況下,你是限制範圍內沒有很好的理由可能的長度)。

但總的來說,避免在比較中混合有符號和無符號類型是一個好主意。重新設計您的代碼以避免它。

+0

我認爲@Someprogrammerdude所做的評論實際上是這種情況下的最佳答案,或者更確切地說,暗示了「幕後」的實際問題是什麼(即OP的思維方式有什麼問題)。 '-10000'應該從初始值移動到條件本身,即'i

+0

除了所有這些 - 儘管我個人在這類問題上並不「苛刻」,但這裏的許多用戶都是 - 因爲問題被標記爲C++,所以您可能希望用'static_cast'替換該C風格的演員。 .. –

+0

@barak manos:我不認爲它是一個問題。我相信在C++代碼中'static_cast'應該保留給指針轉換:分層上傳和從'void *'轉換。算術演員應該用C型演員表達,就像我上面所做的一樣。 – AnT