2015-01-28 15 views
5

Stavo solo sperimentando un codice in programmazione C. e venne a conoscenza di uno strano comportamento. Beh ... Dal momento che non sono un esperto di C, quindi non so se è strano o normale.perché questo ciclo è in esecuzione infinite volte in c?

Fondamentalmente la mia domanda è tutto la differenza tra le seguenti due righe di codice: -

char a = 'h'; // here variable a is not an array of "char" 

e

char a = 'hi'; //here variable a is not an array of "char" as well (i don't know if compiler assumes it as an array or not but , at least i didn't declared it that way) 

ho utilizzato i seguenti codici

primi: -

char a =0; 
for(;a<'hi';a++) 
{ 
    printf("%d= hello world \n",a); 
} 

Secondo: -

char a; 
for(a='h';a<'hi';a++) 
{ 
    printf("%d= hello world \n",a); 
} 

entrambi i cicli di cui sopra continuare a correre per sempre,

qualcuno può dirmi perché?

Potrei mancare un concetto di programmazione molto semplice. per favore aiutatemi ragazzi

+0

Vedere ad es. http://stackoverflow.com/q/3960954/440558 –

+6

Spiega come hai aspettato un tempo infinitamente lungo :-) –

+0

@BasileStarynkevitch: - ah ah .. beh la prima volta era 3000 e il prossimo ho aspettato abbastanza a lungo. (22854) –

risposta

10

Questo perché 'hi' ha il tipo int non uno char. Risolve anche il valore 26729. Ma la variabile loop molto probabilmente (supponendo che char sia di tipo a 1 byte e byte abbia 8 bit) è limitata da 127 e dopo tale overflow.

noti che questo:

char a =0; 
char m = 'hi'; 
for(; a < m; a++) 
{ 
    printf("%d= hello world \n",a); 
} 

funzionerà perché 'hi' si sarà costretto a char (105).

'hi' è un valore letterale a più caratteri. Non è una pratica comune nella programmazione, è una caratteristica "meno conosciuta" C che divenne parte dello standard C99. Maggiori informazioni su di loro: http://zipcon.net/~swhite/docs/computers/languages/c_multi-char_const.html

+2

Potrebbe essere bello dire che questo ha anche un nome proprio - un * letterale multi-carattere * – Mints97

+0

come posso trovare il valore di "ciao". o in base a Mints97 qualsiasi "letterale a più caratteri" –

+2

Il valore intero di un letterale a più caratteri sembra per me un po 'ambiguo: C99 => §6.4.4.4.10: _ "Il valore di una costante di carattere intero contenente più di un carattere (es. 'ab'), [...] è definito dall'implementazione. "_, quindi c'è qualche possibile comportamento indefinito in gioco qui –

1

In C (a differenza di C++, come citato in alcuni commenti), letterali carattere, sempre hanno tipo int. Non importa se si tratta di un normale letterale di un carattere, ad esempio "c" o letterale a più caratteri, ad esempio "ciao". Ha sempre il tipo int, che è necessario per contenere almeno 16 bit. A char contiene esattamente un byte.

Quando si confrontano i valori interi di tipo diverso, le regole di promozione dei numeri interi entrano in azione e il valore intero di dimensioni minori viene promosso a quello più grande. Ecco perché a < 'hi' può essere solo 1 ("true"). Anche se promosso per digitare int, la variabile a non può mai contenere nulla più grande di MAX_CHAR. Ma il letterale a più caratteri 'hi' è un int con un valore maggiore di quello nell'implementazione del tuo compilatore.

La ragione per cui a < m può avere successo è che quando si dichiara m, si inizializzare con 'hi' che viene convertito nel tipo char, che ha infatti la possibilità di confrontare non-meno-che un altro char.

+0

roba dopo il primo paragrafo ... completamente sopra la mia testa. :) Voglio dire non riuscivo a capire la regola della promozione di interi. senza offesa. –

+2

@DemonSOCKET quindi dovresti leggere di più. O farà male dopo. – keltar

+0

sì, penso che dovrei davvero –

Problemi correlati