首页 > 解决方案 > 为什么 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)值赋给另一个变量并与之进行比较,那么它会按预期工作。我在这里缺少什么?它是编译器依赖还是什么?

标签: c++cimplicit-conversionunsignedstrlen

解决方案


strlen返回一个unsigned类型。

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

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

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


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

const char str[] = "Hello World";

推荐阅读