2013-06-12 18 views
6

我写了下面的代码来颠倒C中的一个字符串。代码似乎正常工作,这就是为什么我很困惑。有谁知道为什么这里没有错误?我期待在for循环中出现一个数组越界或无限循环,但似乎循环在它变为负值之前就会中断。Char数组 - 为什么循环不是无限的?

#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

'的for(int i =(int)的LEN-1; i> = 0; I - )'是什么逻辑正确。你所拥有的将是真实的,而'i'小于'len',这总是正确的。 – 2013-06-12 03:43:30

+0

签名/无符号比较是不明智的。 http://stackoverflow.com/a/5416498/489590 –

+4

@Legend so?那不回答他的问题,为什么它为他工作,我们都知道它是如何正确完成的 – Ulterior

回答

16

size_t通常定义为无符号。当您比较已签名和未签名的号码或相等的等级时,已签名的号码将转换为未签名的号码。由于签名的数字可能在您的机器中以二进制补码表示,因此负数实际上较大。

因此,一旦i达到-1,比较认为它比len大。

您可以通过在编译器中打开警告来看到发生了这种情况。

铿锵-Weverything编译程序产生这样的警告

unsigned.c:10:30: warning: comparison of integers of different signs: 
        'int' and 'size_t' (aka 'unsigned long') [-Wsign-compare] 
+0

是的,我认为这是正确的。 –

+2

详细解决方案:当您比较有符号和无符号数_of equal rank_时,有符号数将被_converted_变为无符号数。 – aschepler

+0

奇怪的是,重写(size_t i = len-1; i <= len; i--)也显示工作正常。作为参考,我使用GNU gdb 6.3.50-20050815(Apple版本gdb-1708)x86_64-apple-darwin。 – sager89