2013-06-10 16 views
5
int c = someIntegerValue; 

// Some code... 

int i; 
for (i = 0; i < 5, i < c; i++) { 
... 
} 

Il mio compilatore dice error: expression has no effect, che suona bene. Quindi, quale di questi 2 confronti sarà usato qui? La mia ipotesi è che il i < c viene ignorato, ma volevo qualche conferma da parte degli altri perché non sono ancora in grado di eseguire questo codice ...Cosa fa questa virgola nella porzione * test * di un ciclo for?

+0

Non è un esperto di C, ma che sembra che sta cercando di fare l'equivalente di 'i <5 && i

+0

Il compilatore ha ragione. 'I <5' qui viene valutato, ma il valore viene gettato via senza essere utilizzato, e non ha effetti collaterali, quindi questo programmatore ha chiaramente frainteso qualcosa. –

+0

Perché il down e il voto ravvicinato? L'operatore virgola non è la cosa più intuitiva al mondo. Mi ha fatto inciampare e ho codificato C per quasi 2 decenni. –

risposta

14

La dichiarazione

i < 5, i < c 

Utilizza la comma operator, che valuta tutte le espressioni da sinistra a destra, ma produce solo il valore di quello più a destra. Ciò significa che l'espressione i < 5 viene valutata e scartata, mentre l'espressione i < c viene valutata e effettivamente utilizzata dal ciclo.

Presumo che l'autore intendeva scrivere qualcosa del genere:

i < 5 && i < c 

che considera in realtà entrambe le espressioni.

Detto questo, io non sono sicuro perché questo è un compilatore errore e non un compilatore avvertimento. Questo è un codice legale, anche se è quasi certamente un bug. Forse hai impostato il compilatore per segnalare errori sugli avvisi?

Spero che questo aiuti!

+4

Non direi che "un modo molto migliore per farlo". La versione con '&&' è semanticamente diversa dalla versione con operatore virgola. È molto probabile che la versione "&&" sia ciò che l'autore * intendeva *, ma è impossibile esserne certi. –

+2

'i <5 && i

+0

@ KeithThompson-Sì, hai ragione. Fisso! – templatetypedef

3

È il numero i < 5 che viene ignorato.

L'espressione completa è:

i < 5, i < c

che è di due espressioni distinte accomunate dalla comma-operator.

L'operatore virgola funziona valutando la prima espressione (i < 5), quindi la seconda espressione (i < c) e l'espressione completa assume il valore della seconda parte.

La prima parte dell'espressione è importante solo se ha effetti collaterali.

E 'comunemente, e usato correttamente in questo modo:
esempio

for(i = 0, j = 10; i < 10; ++i, --j) 
/* i goes from 0-10, while j goes from 10-0 at the same time */ 

ma nel modo indicato nel codice, non ha scopo significativo, e confonde solo le altre persone.

1

Qui l'operatore di virgola , svolge un ruolo. Significa che evapora da sinistra a destra e restituisce l'ultima espressione. Quindi viene valutato i<5, i<c viene valutato ma restituisce i<c come ultima espressione.

i < 5, i < c è completamente inutile. Non ha differenza con i < c.

A seconda della logica dell'autore è un errore.

7

Questo è un operatore virgola . Valuta i suoi operandi sinistro e destro (sempre in questo ordine) e produce il risultato dell'operando di destra. Ha senso utilizzarlo se l'operando di sinistra viene valutato per i suoi effetti collaterali; dal i < 5 non ha effetti collaterali, il compilatore ti avverte.

È i < 5, non i < c che viene ignorato. Il codice è equivalente a:

for (i = 0; i < c; i++) { 
    ... 
} 

E 'difficile indovinare che cosa è stato destinato di essere. Forse l'autore voleva dire:

for (i = 0; i < 5 && i < c; i++) { 
    ... 
} 
3

Il risultato dell'operatore virgola è il valore dell'operando di destra.

Qui l'operando sinistro (i < 5) non ha effetto collaterale così

i < 5, i < c 

è in realtà equivalente a

i < c 
2

E 'un risultato dell'uso dell'operatore virgola. L'espressione sinistra viene valutata, quindi il risultato viene scartato. Successivamente viene valutata l'espressione corretta. Il risultato dell'operatore virgola è il risultato dell'espressione corretta.

Poiché l'espressione di sinistra (i < 5) non è attiva, viene visualizzato l'avviso che si sta visualizzando. La domanda ora è "cosa intendeva l'autore?" Senza più contesto, non possiamo davvero dire, ma è probabile che uno di questi:

i < 5 
    i < c 
    i < 5 && i < c