6

我编写了以下代码来反转 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;
}
4

1 回答 1

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]
于 2013-06-12T03:44:07.663 回答