为什么 if 语句中的 strlen 行为异常?

Why does strlen in a if statement behave oddly?

#include <stdio.h>
#include <string.h>

int main()
{
    const char str[11]= "Hello World";
    if(-1 > strlen(str)){
        printf(str);
    }

    return 0;
}

这个 if 条件应该总是 return 假。但这里不是。 但是,如果我将 strlen(str) 值赋给另一个变量并与之进行比较,那么它会按预期工作。 我在这里缺少什么? 它是依赖于编译器还是什么?

strlen returns 一个 unsigned 类型。

这具有将 -1 转换为 unsigned 类型的效果,这是一个很大的数字。

该数字将大于 strlen 结果,因此程序控制到达 if 语句体。

如果将strlen的值赋值给signed类型的变量,并使用它进行比较,则-1不会发生转换,if 语句将按照您的预期运行。


请注意,从技术上讲,您的代码行为未定义,该字符串需要 12 个元素(对于 NUL 终止符),而不是 11 个,并且 strlen 要求 NUL终结器才能正常工作。最好让编译器进行计数,写成

const char str[] = "Hello World";