我已经编写了以下代码来反转C中的字符串。代码似乎正常工作,这就是为什么我感到困惑。有谁知道为什么这里没有错误?我期待for循环中的数组超出界限或无限循环,但似乎循环在它变为负值之前中断。
#include <stdio.h>
#include <string.h>
void reverse(char* str);
void reverse(char* str)
{
size_t len = strlen(str);
for(int i = (int)len-1; i<=len; i--)
{
printf("%c", str[i]);
}
}
int main (int argc, const char * argv[])
{
char string[] = {'h', 'e', 'l', 'l', 'o', '\0'};
reverse(string);
return 0;
}
答案 0 :(得分:16)
size_t通常定义为无符号。比较有符号和无符号数或相等等级时,有符号数将转换为无符号数。由于签名号码可能在您的机器中以二进制补码表示,因此负数实际上更大。
因此,一旦i
命中-1,比较认为它大于len。
您可以通过打开编译器中的警告来看到这种情况。
使用clang编译程序-Weverything产生此警告
unsigned.c:10:30: warning: comparison of integers of different signs:
'int' and 'size_t' (aka 'unsigned long') [-Wsign-compare]