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

时间:2015-05-18 05:11:40

标签: c strlen

在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;

3 个答案:

答案 0 :(得分:10)

  

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

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

此外,将字符串的长度与-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

答案 1 :(得分:4)

strlen(str)返回无符号整数。将有符号整数与无符号整数进行比较时,编译器会将有符号值转换为无符号值。转换为无符号时,-1变为2^32 - 1(假设strlen返回32位整数),这大于您要比较的字符串的长度。

答案 2 :(得分:4)

strlen返回size_t类型的值。这是一种无符号整数类型。

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

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

无论哪种方式,这都意味着-1转换为size_t,从而产生SIZE_MAX这是一个很大的正值。 (无符号类型不能保存负值)。

这个大的正值大于字符串的长度,因此小于比较返回false。