Как ни странно, программисты редко уделяют внимание изучению и использованию операции запятая (comma operator) в языке C++. Давайте посмотрим, что это такое.
Прежде всего, следует знать, что не всякая запятая в тексте вашей программы являетcя операцией. Перечислим запятые, которые являются не операциями, а разделителями:
· Запятые, разделяющие аргументы макроподстановок. Пример:
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
· Запятые, разделяющие аргументы шаблонов. Пример:
template<class A, class B> class C;
· Запятые, разделяющие аргументы функции (при её определении, описании, и вызове);
· Запятые, разделяющие переменные при описании нескольких переменных:
int a, *b, c;
· Запятые, разделяющие вызовы конструкторов внутренних объектов. Пример:
class C{int x; float y; public: C(void): x(9), y(2.5) { ; } };
· Запятые, разделяющие элементы инициализаторов массивов и структур:
int a[] = {1, 2, 3};
Остальные запятые являются операциями. Операция запятая имеет самый низкий приоритет среди всех операций языка C++. У этой операции есть 2 операнда (левый и правый). Вначале вычисляется левый операнд, затем правый, а в качестве результата возвращается правый операнд. Тривиальный пример:
int a = (1 + 2, 3 + 4); //В результате a == 3+4 == 7. Заключёно в
// скобки, так как иначе запятая была бы
// воспринята, как разделитель переменных
Если правый операнд операции запятая является левосторонним выражением (имеет адрес и не является константой), то результатом тоже является левостороннее выражение. В этом случае результату можно присваивать значение или вычислять адрес:
int a = 1, b = 2;
(a, b) = 3; //В результате a==1, b==3