我正在分析一个场景:
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++)
{
}
在我看来,for
循环中的strlen(str) - 1
是令人困惑的。
strlen(str) - 1
在for循环中的值为4294967295。
为什么会这样?而不是-1呢?
strlen
的结果类型为size_t
,但您使用矛盾的格式说明符进行打印。size_t
的正确格式说明符是%zu
。 - fuzstrlen()
的返回类型是size_t
,即无符号整数,因此 wraparound/underflow 是被明确定义的,而且不是未定义行为。 - chux - Reinstate Monica%u
和%ul
的输出,显然没有注意到%ul
只是%u
后面加上l
。 - ruakh