2013-06-12 39 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