为什么 -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。
在 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。