当str为空时,'for'循环条件下strlen(str) - 1的值是多少?

Shr*_*_me 5 c

我正在分析一个场景:

char str[] = ""; // Understand
Run Code Online (Sandbox Code Playgroud)

如果我理解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);
Run Code Online (Sandbox Code Playgroud)

输出是:

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

我也理解这些.

for (int i = 0; i < strlen(str) - 1; i++)
{
}
Run Code Online (Sandbox Code Playgroud)

在这里,我不明白的价值来决定strlen(str) - 1将在for循环条件.

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

P.P*_*.P. 16

strlen返回size_t是无符号整数.如果是,那么strlen(str)-1会产生SIZE_MAX(最大值size_t可以保持).strlen(str)0

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


Vla*_*cow 3

这个说法

printf(" %d,  %ul,  %u, %d,  %ul, %u", strlen(str),strlen(str),strlen(str),strlen(str)-1,strlen(str)-1,strlen(str)-1);
Run Code Online (Sandbox Code Playgroud)

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

在循环的条件下

for (int i=0;i<strlen(str)-1;i++)
Run Code Online (Sandbox Code Playgroud)

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

i<strlen(str)-1
Run Code Online (Sandbox Code Playgroud)

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

右操作数的类型为int。它的rank至少不大于size_type的rank。因此两个操作数都被转换为类型size_t并具有非负值。

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

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

for ( int i = 0; i < ( int )strlen( str ) - 1; i++ )
Run Code Online (Sandbox Code Playgroud)