Оператор "запятая": ,
Позволяет группировать два оператора, когда ожидается один.
Синтаксис
expression , expression
Remarks
Оператор-запятая имеет ассоциативность слева направо. Два выражения, разделенные запятой, вычисляются в направлении слева направо. Левый операнд вычисляется всегда и перед вычислением правого операнда учитываются все побочные эффекты.
В некоторых контекстах, например в списках аргументов функций, в качестве разделителей можно использовать запятые. Не следует путать использование запятой в качестве разделителя с ее использованием в качестве оператора; эти два варианта использования совершенно различны.
Рассмотрим выражение 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++, приоритет и ассоциативность
Оператор последовательной оценки