【发布时间】: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) - 1 在for 循环条件中的值是什么。
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