今天我试图调试一个应用程序,我发现了一个包含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循环应该永远不会被执行(字符串&gt; = 9),但它实际上无限循环。
答案 0 :(得分:9)
将strlen()的结果保存在变量中。
您的变量与strlen()
返回的变量类型不同。这是从size_t
到int
的隐式转换,使其有效。
非工作版本通常会将9 - strlen(test)
评估为(size_t)9 - strlen(test)
,这是一个非常大的无符号数,而不是9 - (int)strlen(test)
,这是一个带负号的数字。