布尔表达式中带有 strlen() 的奇怪行为

Strange behavior w/ strlen() in boolean expression

本文关键字:strlen 布尔表达式      更新时间:2023-10-16

今天我试图调试一个应用程序,我发现了包含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),但它实际上是无限循环的。

将 strlen() 的结果保存在变量中是有效的。

您的变量与strlen()返回的类型不同。正是从size_tint的隐式转换使其正常工作。

非工作版本通常将9 - strlen(test)评估为(size_t)9 - strlen(test),一个非常大的无符号数,而不是9 - (int)strlen(test)负有符号数。