2013-06-12 7 views
6

Ho scritto il seguente codice per invertire una stringa in C. Il codice sembra funzionare correttamente ed è per questo che sono confuso. Qualcuno sa perché non c'è un errore qui? Mi aspettavo un array fuori limite o un ciclo infinito sul ciclo for, ma sembra che il ciclo si interrompa prima di arrivare a valori negativi.Char Array - Perché il ciclo non è infinito?

#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 -)' è ciò che è logicamente corretto. Quello che hai, sarebbe vero mentre 'i' è inferiore a' len', che è sempre vero. Il confronto firmato/non firmato –

+0

non è consigliabile. http://stackoverflow.com/a/5416498/489590 –

+4

@Legend quindi? questo non risponde alla sua domanda, perché funziona per lui, sappiamo tutti come è fatto correttamente – Ulterior

risposta

16

size_t è generalmente definito come non firmato. Quando confronti un numero firmato e un numero senza segno o uguale, il numero firmato viene convertito in non firmato. Dal momento che il numero firmato è probabilmente rappresentato in complemento a due nella tua macchina, i numeri negativi sono in realtà più grandi.

Quindi, una volta che i colpisce -1, è più grande il confronto pensa sia maggiore di len.

Si può vedere questo sta accadendo attivando avvisi nel compilatore.

Compilare il programma con -Weverything clangore produce questo avvertimento

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

Sì, penso che sia corretto. –

+2

Correzioni di dettaglio: quando si confronta un numero firmato e un numero senza segno _ di uguale valore_ il numero firmato viene _ convertito_ in non firmato. – aschepler

+0

Stranamente, riscrivere come per (size_t i = len-1; i <= len; i--) sembra funzionare correttamente. Per riferimento, sto usando GNU gdb 6.3.50-20050815 (versione Apple gdb-1708) x86_64-apple-darwin. – sager89

Problemi correlati