为什么 -1>strlen(t) 在 C 中为真?

why is -1>strlen(t) true in C?

在 VS2013 中处理这段代码,但由于某些原因,print.it 似乎 -1>strlen(str)

任何人都知道我做错了什么

char *str="abcd";
if(-1<strlen(str))
printf("The size of the string is %d", strlen(str));    
return 0;

strlen(str) returns 一个无符号整数。将有符号整数与无符号整数进行比较时,编译器会将有符号值转换为无符号值。当转换为无符号时,-1 变为 2^32 - 1(假设 strlen returns 是一个 32 位整数),它大于您正在比较的字符串的长度。

Anyone got an idea what i'm doing wrong

strlen()returns一个size_t,这是一个无符号整数类型。 -1 解释为无符号整数是一个很大的值,因此它最终会大于字符串的长度。您可以在 gcc 和其他一些编译器中使用 -Wsign-compare 标志,以便在您尝试比较有符号和无符号值时发出警告。

此外,将字符串的长度与-1进行比较也没有多大意义。长度永远不能为负; 总是 0 或更大。因此,您可能希望重写代码以针对 0 进行测试,或者以其他方式正确实现您尝试测试的任何条件。

if(-1<strlen(str)) printf("The size of the string is %d", strlen(str));

在此代码中,您可能合理地期望测试始终成功并执行 printf(),因为长度始终为 0 或更长。但是您发现测试实际上失败了,并且 printf() 从未发生,因为 -1 被提升为无符号数,因此它可以与 size_t 进行比较。简单的解决方案是完全删除条件:您知道测试总是会成功,所以没有必要这样做。只需删除 if*:

printf("The size of the string is %zu", strlen(str));

*此外,将打印格式说明符从 %d 更改为 %zu 因为正如 Matt McNabb 在评论中指出的那样,您正在尝试打印 size_t.

strlen returns size_t 类型的值。这是一个无符号整数类型。

C 中将有符号值与相应无符号类型的值进行比较的规则是,有符号值将转换为无符号值。

如果值是不同大小的类型,例如,如果您的系统有 4 字节 int 和 8 字节 size_t,则规则是转换较小类型的值到较大类型的值。

无论哪种方式,这都意味着 -1 被转换为 size_t,导致 SIZE_MAX,这是一个很大的正值。 (无符号类型不能包含负值)。

这个大的正值大于你的字符串的长度,所以小于比较 returns false。