2016-01-29 41 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),这是一个负号。