De komma-operator , in de C-taal combineert twee (of meer) expressies, waarbij ze een voor een van links naar rechts worden geëvalueerd en de waarde van de laatste expressie wordt geretourneerd:
int x = (f(), g()); // f() en g() worden aangeroepen, x == resultaat van g()
Het wordt het meest gebruikt in for-lussen:
for(int i = 0, j = 10; i < j; ++i, --j) { ... }
Wanneer nuttig:
Valstrikken:
Vraag: Wat print de volgende code?
int a = 1; int b = (a = 2, a + 3); printf("%d\n", b);
Antwoord: Dit zal "5" afdrukken. Eerst wordt a=2 toegewezen, waarna de expressie a+3 2+3=5 berekent, en deze waarde zal aan de variabele b worden toegewezen.
Verhaal
In een C-project gebruikte een ontwikkelaar de komma-operator zonder haakjes in een return-functie:
return x++, y++;Er werd verwacht dat de functie y+1 zou retourneren, maar feitelijk beschouwt return alleen het resultaat van de expressie aan de rechterkant, terwijl x++ apart wordt geëvalueerd. Dit verwarrde de gebruiker, aangezien het resultaat van return niet was wat hij had bedoeld.
Verhaal
In een for-lus plaatste een programmeur per ongeluk een komma in plaats van een puntkomma:
for(i=0, i<10, i++) ...Het programma compileerde, maar de lus werd maar één keer uitgevoerd, omdat de expressie i<10, i++ in de voorwaarden van for altijd de waarde van de laatste expressie (i++) retourneert, en niet de voortgangsvoorwaarde van de lus.
Verhaal
Bij het schrijven van macro's definieerde een van de ontwikkelaars:
#define DO(x, y) x, y int v = DO(f(), g());Hij verwachtte dat beide functies zouden worden aangeroepen, maar vergat haakjes te plaatsen. Uiteindelijk werd alleen f(); aangeroepen; de waarde van g() werd niet aan v toegewezen. Correct gebruik:
#define DO(x, y) ((x), (y)).