Operator przecinka (,) w C pozwala łączyć kilka wyrażeń, z których wynikiem jest wartość ostatniego wyrażenia.
Przykład:
int a = 1, b = 2, c; c = (a += 2, b += 3, a + b); // najpierw zwiększamy a, potem b, potem sumujemy a + b
Użycie:
for, gdzie wymagana jest kolejna akcja.Szczegóły:
Przykład pętli:
for (i = 0, j = 10; i < j; ++i, --j) { /* ... */ }
Jaka jest różnica między przecinkiem jako operatorem a jako separatorem w liście argumentów funkcji?
Powszechne błędy: Uważa się, że przecinek w dowolnym miejscu jest operatorem i zawsze łączy wyrażenia.
Prawidłowa odpowiedź: Przecinek jest operatorem tylko poza listami inicjalizacji, argumentów i elementów tablicy. Na przykład:
int x = (1, 2); // x == 2, tu operator void foo(int a, int b) { ... } // tutaj — separator
Przecinek jako operator działa tylko wewnątrz nawiasów, w pozostałych przypadkach jest po prostu separatorem.
Historia
Makro, w którym wewnątrz do { ... } while (0) użyty był operator przecinka do łączenia instrukcji bez nawiasów, w wyniku czego coś w stylu if (a) MACRO(); else ... prowadziło do błędu składniowego z powodu niewłaściwej składni makra.
Historia
Zamieszanie między priorytetem operatora przecinka a priorytetem przypisania doprowadziło do tego, że wyrażenie a = b, c = d; działało jako (a = b), (c = d), podczas gdy programista zakładał, że oba przypisania są wykonywane jednocześnie jako część jednego wyrażenia.
Historia
W funkcji użyto przecinka do sekwencyjnego wywołania funkcji, ale ignorowano, że tylko ostatnia wartość jest zwracana. Zakładano, że wynikowe wyrażenie łączy efekty wszystkich wywołań, podczas gdy w rzeczywistości ważne były tylko efekty uboczne pierwszych wywołań, a ich wartości zwracane były tracone.