Оператор запятой: ,

Позволяет группировать два оператора, когда ожидается один.

Синтаксис

expression , expression

Замечания

Оператор-запятая имеет ассоциативность слева направо. Два выражения, разделенные запятой, вычисляются в направлении слева направо. Левый операнд вычисляется всегда и перед вычислением правого операнда учитываются все побочные эффекты.

В некоторых контекстах, например в списках аргументов функций, в качестве разделителей можно использовать запятые. Не следует путать использование запятой в качестве разделителя с ее использованием в качестве оператора; эти два варианта использования совершенно различны.

Рассмотрим выражение e1, e2. Тип и значение выражения — это тип и значение e2; результат вычисления e1 не карта. Если правый операнд — L-значение, результатом будет L-значение.

В тех случаях, когда в качестве разделителя обычно используется запятая (например, в фактических аргументах для функций или составных инициализаторов), оператор-запятую и его операнды следует заключать в скобки. Например:

func_one( x, y + 2, z );
func_two( (x--, y + 2), z );

В приведенном выше вызове функции func_one передаются три аргумента, разделенные запятыми: x, y + 2 и z. В вызове функции func_two скобки заставляют компилятор интерпретировать первую запятую в качестве оператора последовательного вычисления. В этом вызове функции в функцию func_two передаются два аргумента. Первым аргументом является результат операции последовательного вычисления (x--, y + 2), который имеет значение и тип выражения y + 2; второй аргумент — z.

Пример

// cpp_comma_operator.cpp
#include <stdio.h>
int main () {
   int i = 10, b = 20, c= 30;
   i = b, c;
   printf("%i\n", i);

   i = (b, c);
   printf("%i\n", i);
}
20
30

См. также

Выражения с бинарными операторами
Операторы C++, приоритет и ассоциативность
Оператор последовательного вычисления