L'operatore virgola , nel linguaggio C unisce due (o più) espressioni, calcolandole in sequenza da sinistra a destra e restituendo il valore dell'ultima espressione:
int x = (f(), g()); // vengono chiamati f() e g(), x == risultato di g()
È più comunemente usato nei cicli for:
for(int i = 0, j = 10; i < j; ++i, --j) { ... }
Quando è utile:
Insidie:
Domanda: Cosa stamperà il seguente codice?
int a = 1; int b = (a = 2, a + 3); printf("%d ", b);
Risposta: Stampa "5". Prima viene assegnato a=2, dopodiché l'espressione a+3 calcola 2+3=5, e proprio questo valore sarà assegnato alla variabile b.
Storia
In un progetto in C, uno sviluppatore ha usato l'operatore virgola senza parentesi nella funzione di ritorno:
return x++, y++;Ci si aspettava che la funzione restituisse y+1, ma in realtà il return considera solo il risultato dell'espressione a destra, mentre a sinistra x++ viene calcolato separatamente. Questo ha confuso l'utente, poiché il risultato del return si è rivelato diverso da quanto previsto.
Storia
In un ciclo for, un programmatore ha accidentalmente messo una virgola invece di un punto e virgola:
for(i=0, i<10, i++) ...Il programma si è compilato, ma il ciclo è stato eseguito solo una volta, poiché l'espressione i<10, i++ nelle condizioni del for restituisce sempre il valore dell'ultima espressione (i++), non la condizione di continuazione del ciclo.
Storia
Scrivendo macro, uno degli sviluppatori ha definito:
#define DO(x, y) x, y int v = DO(f(), g());Si aspettava che entrambe le funzioni venissero chiamate, ma ha dimenticato di mettere le parentesi. Di conseguenza, è stata chiamata solo f(); il valore di g() non è stato assegnato a v. Uso corretto:
#define DO(x, y) ((x), (y)).