2012-02-09 11 views
5

ho avuto questa domanda dopo aver letto questa discussione Print an int in binary representation using CComprendere la condizione di uscita di un ciclo for

In un utente commento, hanno pubblicato questo ciclo for, che assegna un 1 o uno 0 alla posizione di bit al fine di convertire da un decimale int in char * binario.

for(; bits--; u >>= 1) 
    str[bits] = u & 1 ? '1' : '0'; 

Capisco perché non è necessario essere un valore inizializzato. Questa è la sintassi per un ciclo for che ho sempre saputo:

for (variable initialization; condition; variable update) 

Quello che non capisco è come 'bit--' può essere una condizione di uscita. Per favore aiutami a capire come funziona questo codice (l'ho testato ed è valido).

Grazie.

+1

Questo è ciò per cui i programmatori C sono maledetti !! Produrre codice che fa qualcosa ma nessuno lo capisce più. Non provare a scrivere un codice del genere !! bits-- decrementa la variabile bits, una volta zero, restituisce false – guitarflow

+1

@guitarflow Coloro che capiscono C e i suoi idiomi comprendono tale codice bene come questo molto comune nel codice C (incluso il libro K & R), e direi che questo idioma deve essere appreso per comprendere il codice C in generale. Quindi perché dovrebbe essere scritto un nuovo codice (in qualsiasi lingua) per coloro che non comprendono la lingua? La forma più "universalmente comprensibile" può anche complicare le cose per un lettore che parla fluentemente il linguaggio, cioè "perché non ha usato [linguaggio comune], c'è qualcosa che mi manca?" – Arkku

+0

@Arkku Capisco anche il codice , ma devi essere d'accordo non è un buon stile di programmazione. Scrivere il ciclo for in modo "standard" lo rende più leggibile a chiunque, non solo alle crepe. Anche nomi di variabili come "u" non sono un nome descrittivo;) – guitarflow

risposta

8

In C, un valore pari a zero restituisce "falso" in un contesto booleano. Pertanto, quandorestituisce 0, nel contesto del ciclo viene valutato come "falso" e termina il ciclo.

Se dici, per esempio:

int x = 1; 
if (--x) 
{ 
    printf("True!\n"); 
} 
else 
{ 
    printf("False!\n"); 
} 

il risultato sarà "False", perché --x viene valutata a 0, che è "falso" in un contesto booleano.

+0

Ok, avevo il sospetto che fosse così. Grazie. –

+4

Charles, hai ragione, ma --x non è lo stesso di x--. Se si modifica il codice sopra per x--, verrà stampato "True!". – Diego

+0

@ dfmx123, la differenza tra post-incremento e pre-incremento è un altro problema, e non proprio nell'ambito della domanda qui. Il punto è semplicemente dimostrare che le espressioni che valutano a zero sono considerate "false" in un contesto condizionale. –

1

Tutte le condizioni si riducono fondamentalmente al controllo della presenza di 0 o meno. 0 significa false, tutto il resto significa true. In modo che ciclo si romperà quando bits è 0.

A volte si vede while o if condizioni scritte

if (variable) // or while(variable) 

Questo è solo una scorciatoia per

if (variable != 0) // or while (variable != 0) 

Così

for (; bits--; u >>= 1) 

è l'abbreviazione di

for (; bits-- != 0; u >>= 1) 
+0

In realtà, in C tutto è considerato vero tranne lo zero, penso. – guitarflow

+0

@guitarflow sei corretto, ho corretto la mia risposta –

0

bit - è un'espressione di assegnazione di tipo int (poiché restituirà il valore di b, che è int). Per abbinare la sintassi del ciclo for, viene convertita in un'espressione booleana, il che significa che è true se i bit! = 0. In effetti, la condizione è identica ai bit! = 0, ma usando i bit--, cambia il valore di bit allo stesso tempo, rendendo il codice più compatto, tutto qui.

0

Come detto in C, è possibile utilizzare numeri interi come condizione - 0 o false, altro per true. (In realtà, è quasi sempre farlo - anche un'espressione come a<b è un int)

Così, il ciclo termina quando bits-- sarà 0.

Quando l'operatore -- viene dopo la variabile, diminuisce la variabile e ottiene il valore precedente. per esempio, se hai int a=3,b; b=a--;, allora b sarà 3, e sarà 2.

Quindi, il ciclo uscirà dopo che i bit saranno stati ridotti da 0 a -1. Ciò significa che, se all'inizio, bits==8 (ad esempio), il ciclo verrà iterato 8 volte, quando nel primo i bit saranno 7 (perché la condizione è stata verificata) e nell'ultimo i bit saranno 0. Bel modo di passare in rassegna un array (poiché in c, l'array delle variabili bits è stato indicizzato da 0 a bits-1).