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

Tj *_*j L 5 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;
Run Code Online (Sandbox Code Playgroud)

Cal*_*leb 10

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

strlen()返回a size_t,这是一个无符号整数类型.-1解释为无符号整数是一个较大的值,因此最终会大于字符串的长度.当您尝试比较有符号和无符号值时,可以使用-Wsign-compareflag gcc和其他一些编译器来警告您.

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

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

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

printf("The size of the string is %zu", strlen(str));
Run Code Online (Sandbox Code Playgroud)

*另外,打印格式说明从改变%d%zu,因为,正如马特麦克纳布在评论中指出,你想打印size_t.