我正在分析一个场景:
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值.
这个说法
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(函数的返回类型strlen是size_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)