L'operatore virgola (,) in C permette di combinare diverse espressioni, il risultato delle quali è il valore dell'ultima espressione.
Esempio:
int a = 1, b = 2, c; c = (a += 2, b += 3, a + b); // prima incrementiamo a, poi b, poi sommiamo a + b
Utilizzo:
for, dove è necessario eseguire più operazioni.Aspetti particolari:
Esempio di ciclo:
for (i = 0, j = 10; i < j; ++i, --j) { /* ... */ }
Qual è la differenza tra la virgola come operatore e come separatore in una lista di argomenti di funzione?
Errore comune: Si pensa che la virgola in qualsiasi posizione sia un operatore e unisca sempre le espressioni.
Risposta corretta: La virgola è un operatore solo al di fuori delle liste di inizializzazione, degli argomenti e degli elementi di un array. Ad esempio:
int x = (1, 2); // x == 2, qui è un operatore void foo(int a, int b) { ... } // qui è un separatore
La virgola come operatore funziona solo all'interno delle parentesi, in altri casi è semplicemente un separatore.
Storia
Una macro, dove all'interno di do { ... } while (0) veniva utilizzato l'operatore virgola per unire istruzioni senza parentesi, portava a sintassi errata in una situazione come if (a) MACRO(); else ... a causa della sintassi errata della macro.
Storia
La confusione tra la priorità dell'operatore virgola e la priorità dell'assegnazione portava al fatto che l'espressione a = b, c = d; funzionava come (a = b), (c = d), mentre il programmatore presumeva che entrambe le assegnazioni venissero eseguite simultaneamente come parte di un'unica espressione.
Storia
Nella funzione veniva utilizzata la virgola per chiamate di funzione in sequenza, ma veniva ignorato il fatto che solo l'ultimo valore viene restituito. Si presumeva che l'espressione risultante unisse gli effetti di tutte le chiamate, mentre in realtà erano solo gli effetti collaterali delle prime chiamate a essere importanti, e i loro valori di ritorno venivano persi.