Der Komma-Operator , in der Programmiersprache C verbindet zwei (oder mehr) Ausdrücke, indem sie nacheinander von links nach rechts ausgewertet werden und den Wert des letzten Ausdrucks zurückgibt:
int x = (f(), g()); // es werden f() und g() aufgerufen, x == Ergebnis von g()
Am häufigsten wird er in for-Schleifen verwendet:
for(int i = 0, j = 10; i < j; ++i, --j) { ... }
Wann nützlich:
Fallstricke:
Frage: Was wird der folgende Code ausgeben?
int a = 1; int b = (a = 2, a + 3); printf("%d\n", b);
Antwort: Gibt "5" aus. Zuerst wird a=2 zugewiesen, danach wird der Ausdruck a+3 evaluiert, also 2+3=5, und genau dieser Wert wird der Variablen b zugewiesen.
Geschichte
In einem C-Projekt verwendete ein Entwickler den Komma-Operator ohne Klammern in einer Rückgabefunktion:
return x++, y++;Es wurde erwartet, dass die Funktion y+1 zurückgibt, aber tatsächlich berücksichtigt return nur das Ergebnis des rechten Ausdrucks, während links x++ separat berechnet wird. Dies verwirrte den Code des Benutzers, da das Ergebnis von return nicht das war, was gedacht wurde.
Geschichte
In einer
for-Schleife hat ein Programmierer versehentlich ein Komma anstelle eines Semikolons gesetzt:for(i=0, i<10, i++) ...Das Programm wurde kompiliert, die Schleife wurde jedoch nur einmal ausgeführt, da der Ausdruck i<10, i++ in den Bedingungen von for immer den Wert des letzten Ausdrucks (i++) zurückgibt, und nicht die Bedingung für die Fortsetzung der Schleife.
Geschichte
Bei der Erstellung von Makros definierte einer der Entwickler:
#define DO(x, y) x, y int v = DO(f(), g());Er erwartete, dass beide Funktionen aufgerufen werden, vergaß jedoch, Klammern zu setzen. Letztendlich wurde nur f() aufgerufen; der Wert von g() wurde nicht v zugewiesen. Die korrekte Verwendung ist:
#define DO(x, y) ((x), (y)).