2016-01-29 43 views
1

今天我試圖調試一個應用程序,並發現了一個包含strlen()的布爾表達式的奇怪行爲。布爾表達式中的strlen()的奇怪行爲

這裏有一個簡單的代碼來重現問題。

char test[20] = "testTestTest"; //the length is 12 
bool b = 0 < (9 - strlen(test)); //should be false (0 < -3) = false 

在執行結束時b是真的,但它應該是假的。

將strlen()的結果保存在變量中。

char test[20] = "testTestTest"; //the length is 12 
int length = strlen(test);  //save the length 
bool b = 0 < (9 - length);  //should be false (0 < -3) = false 

在執行B的端部是假的(因爲它被認爲是)。

這兩種實現有什麼區別?
爲什麼第一個不起作用?

最初受影響的代碼是這樣的:

char test[20] = "testTestTest"; //the length is 12 
for(int i = 0; i < (9 - strlen(test)); i++){ 
    //do something (in my case I do NOT edit the test string) 
} 

for循環是應該永遠不會執行(與字符串> = 9),但它實際上無限循環。

+1

實際上'boolean'是什麼?這不是一個C++內在類型。 –

+0

對不起,我犯了一個錯誤。這是愚蠢的。 –

+0

此外,只是一個提示,從不在循環中使用'strlen' - 它需要O(n),其中n是字符串大小,所以您只是一次又一次地進行相同的操作,不必要的 –

回答

9

將strlen()的結果保存在變量中。

您的變量與strlen()返回的類型不同。這是從size_tint的隱式轉換,它使它工作。

非工作版本通常將9 - strlen(test)評爲(size_t)9 - strlen(test),這是一個非常大的無符號數,而不是9 - (int)strlen(test),這是一個負號。