提问者:小点点

为什么if语句中的strlen会有奇怪的行为?


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

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

    return 0;
}

此if条件应始终返回false。 但这里不是。 但是如果我把strlen(str)值放到另一个变量中,并与之进行比较,那么它就会像预期的那样工作。 我错过了什么? 是依赖于编译器还是什么?


共1个答案

匿名用户

strlen返回无符号类型。

它具有将-1转换为无符号类型的效果,该类型是一个大数字。

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

如果将strlen的值分配给signed类型的变量,并使用该变量进行比较,则将不会发生-1的转换,而If语句将按照您预期的方式运行。

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

const char str[] = "Hello World";