布尔表达式中带有 strlen() 的奇怪行为
Strange behavior w/ strlen() in boolean expression
今天我试图调试一个应用程序,我发现了一个包含 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)但它实际上会无限循环。
Saving the result of strlen() in a variable works.
您的变量类型与 strlen()
returns 不同。这是从 size_t
到 int
的隐式转换,使它起作用。
非工作版本通常将 9 - strlen(test)
计算为 (size_t)9 - strlen(test)
,一个非常大的无符号数,而不是 9 - (int)strlen(test)
,一个负符号数。
今天我试图调试一个应用程序,我发现了一个包含 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)但它实际上会无限循环。
Saving the result of strlen() in a variable works.
您的变量类型与 strlen()
returns 不同。这是从 size_t
到 int
的隐式转换,使它起作用。
非工作版本通常将 9 - strlen(test)
计算为 (size_t)9 - strlen(test)
,一个非常大的无符号数,而不是 9 - (int)strlen(test)
,一个负符号数。