【问题标题】:What will be the value of strlen(str)- 1 in a 'for' loop condition when str is empty?当 str 为空时,“for”循环条件中 strlen(str)-1 的值是多少?
【发布时间】:2015-09-30 10:32:24
【问题描述】:

我正在分析一个场景:

char str[] = ""; // Understand

如果我理解strlen(str),结果是0。没关系。

printf(" %d,  %ul,  %u, %d,  %ul, %u", 
    strlen(str),
    strlen(str),
    strlen(str),
    strlen(str) - 1,
    strlen(str) - 1,
    strlen(str) - 1);

输出是:

0, 0l, 0, -1, 4294967295l, 4294967295

我也明白这些。

for (int i = 0; i < strlen(str) - 1; i++)
{
}

这里我不明白strlen(str) - 1for 循环条件中的值是什么。

strlen(str) - 1 在 for 循环中给出值 4294967295。 这是为什么?为什么不是-1?

【问题讨论】:

  • 害怕调试器?尝试踩踏!
  • 您的代码包含未定义的行为。 strlen 的结果具有 size_t 类型,但您使用相互矛盾的格式说明符打印它。 size_t 的正确格式说明符是 %zu
  • @user3629249 “环绕/下溢是被认为是未定义行为的事情之一”对于有符号整数是正确的,但在这里不是。由于strlen() 的返回类型是size_t,一个无符号整数,环绕/下溢是明确定义的并且不是未定义的行为。
  • 四个赞成票,基本上是“0-1”??
  • @JimBalter:噗,没什么。 (S)他还包括%u%ul 的输出,显然没有注意到%ul 只是%u 后跟l

标签: c


【解决方案1】:

strlen 返回size_t,它是一个无符号整数。所以如果strlen(str)0strlen(str)-1 将产生SIZE_MAXsize_t 可以保持的最大值)。

您应该使用%zu 打印size_t 值。

【讨论】:

    【解决方案2】:

    此声明

    printf(" %d,  %ul,  %u, %d,  %ul, %u", strlen(str),strlen(str),strlen(str),strlen(str)-1,strlen(str)-1,strlen(str)-1);
    

    表明当strlen( str ) - 1 像无符号整数一样输出时,例如使用格式说明符%ul,其值为4294967295l

    在循环的条件下

    for (int i=0;i<strlen(str)-1;i++)
    

    编译器必须确定左右操作数的共同类型,才能确定条件结果的类型

    i<strlen(str)-1
    

    右操作数strlen(str)-1的类型为size_t(函数strlen的返回类型为size_t)。它是无符号整数类型,通常对应于unsigned long。它不能有负值。存储在此类型对象中的任何值都被解释为非负值,并且输出显示strlen(str)-1 的值等于4294967295l。 (如果您使用类型说明符%zu,您可以获得的实际值,因为可能不排除size_t 甚至可以对应于 unsigned long long)

    右操作数的类型为int。它的等级至少不大于 size_type 的等级。所以这两个操作数都被转换为size_t 类型并且具有非负值。

    这种确定通用类型的过程称为通常的算术转换。 很明显,4294967295l 大于 0。因此如果没有 break 语句,循环将迭代 4294967295l 次。

    如果按照以下方式重写循环中的条件,您可以获得预期的结果

    for ( int i = 0; i < ( int )strlen( str ) - 1; i++ )
    

    【讨论】:

    • 4294967295中的小写l是什么
    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2011-01-04
    • 2022-06-15
    相关资源
    最近更新 更多