为什么 if 语句中的 strlen 行为异常?
Why does strlen in a if statement behave oddly?
#include <stdio.h>
#include <string.h>
int main()
{
const char str[11]= "Hello World";
if(-1 > strlen(str)){
printf(str);
}
return 0;
}
这个 if 条件应该总是 return 假。但这里不是。
但是,如果我将 strlen(str)
值赋给另一个变量并与之进行比较,那么它会按预期工作。
我在这里缺少什么?
它是依赖于编译器还是什么?
strlen
returns 一个 unsigned
类型。
这具有将 -1
转换为 unsigned
类型的效果,这是一个很大的数字。
该数字将大于 strlen
结果,因此程序控制到达 if
语句体。
如果将strlen
的值赋值给signed
类型的变量,并使用它进行比较,则-1
不会发生转换,if
语句将按照您的预期运行。
请注意,从技术上讲,您的代码行为未定义,该字符串需要 12 个元素(对于 NUL
终止符),而不是 11 个,并且 strlen
要求 NUL
终结器才能正常工作。最好让编译器进行计数,写成
const char str[] = "Hello World";
#include <stdio.h>
#include <string.h>
int main()
{
const char str[11]= "Hello World";
if(-1 > strlen(str)){
printf(str);
}
return 0;
}
这个 if 条件应该总是 return 假。但这里不是。
但是,如果我将 strlen(str)
值赋给另一个变量并与之进行比较,那么它会按预期工作。
我在这里缺少什么?
它是依赖于编译器还是什么?
strlen
returns 一个 unsigned
类型。
这具有将 -1
转换为 unsigned
类型的效果,这是一个很大的数字。
该数字将大于 strlen
结果,因此程序控制到达 if
语句体。
如果将strlen
的值赋值给signed
类型的变量,并使用它进行比较,则-1
不会发生转换,if
语句将按照您的预期运行。
请注意,从技术上讲,您的代码行为未定义,该字符串需要 12 个元素(对于 NUL
终止符),而不是 11 个,并且 strlen
要求 NUL
终结器才能正常工作。最好让编译器进行计数,写成
const char str[] = "Hello World";