C 字符数组-为什么for循环不是无限的?

C 字符数组-为什么for循环不是无限的?,c,C,我编写了以下代码来反转C中的字符串。代码似乎工作正常,这就是我感到困惑的原因。有人知道为什么这里没有错误吗?我本来以为for循环中会出现一个数组越界或无限循环,但似乎循环在达到负值之前就中断了 #include <stdio.h> #include <string.h> void reverse(char* str); void reverse(char* str) { size_t len = strlen(str); for(int i = (

我编写了以下代码来反转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;
}
#包括
#包括
无效反向(char*str);
无效反向(字符*str)
{
尺寸长度=strlen(str);

对于(int i=(int)len-1;isize_t通常定义为无符号。当您比较有符号数和无符号数或相等秩时,有符号数将转换为无符号数。由于有符号数可能在您的计算机中以2的补码表示,负数实际上更大

因此,一旦
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]

(int i=(int)len-1;i>=0;i--)的
是逻辑上正确的。你所拥有的将是真实的,而
i
小于
len
,这始终是真实的。有符号/无符号比较是不明智的。@传说如此?这并不能回答他的问题,为什么它对他有效,我们都知道它是如何做到的properly@Ulterior这是一个逻辑上的缺陷。我不懂C/C++并且只懂from是Java和ASM背景。“我们都知道如何正确地完成它”,很明显,这并不是因为这里做得很差,你支持这样的行为。@Ulterior,我也没有作为答案发布。如果我想回答,我会发布一个答案。详细修复:当你比较一个有符号数和一个无符号数的相等秩时,有符号数被转换为无符号数。奇怪的是,对于(尺寸i=len-1;i@sager89由于大小\u t是无符号的,所以0-1很大。(最大值)约为40亿。(2^32-1)。整数已滚动。@FDinoff除我的情况外,大小\u t是2^64-1或18446744073709551615。