Операция запятая (,), называемая операцией последования, соединяет два произвольных выражения, которые вычисляются слева направо. Сначала вычисляется выражение левого операнда. Тип его результата считается void. Затем вычисляется выражение правого операнда. Значение и тип результата операции последования считается равным значению и типу правого операнда. Например, фрагмент текста:
a = 4;
b = а + 5;
можно записать как:
а = 4, b = а + 5;
Можно рекурсивно соединить операциями запятая последовательность выражений:
выражение_1, выражение_2, . выражение_n
Выражения будут вычисляться слева направо, а самое правое выражение определит значение и тип всей этой последовательности.
Соединяться запятыми могут не только выражения присваивания, но и другие. Например, вызов функции с тремя параметрами может иметь вид
func(i, (j = 1, j + 4) , k);
Здесь в качестве второго параметра передается значение операции последования, заключенной в скобки. В результате вызов производится со следующими аргументами: (i, 5, к).
Операция последования используется в основном в операторах цикла for для задания в заголовке некоторой совокупности действий. Например, цикл подсчета суммы элементов некоторого массива можно осуществить циклом for без использования операции последования:
int А[10], sum, i;
...
sum = А[0];
for (int i = 1; i < 10; i++)
sum += A [i];
То же самое можно реализовать более компактно с помощью операции последования:
int А[10], sum, i;
...
for (i = 1, sum = A[0]; i < 10; sum += A[i], i++);
Здесь операция последования использована дважды: при задании действий, выполняемых перед началом цикла (задание начальных значений i и sum), и при описании действий, выполняемых в теле цикла (суммирование значений элементов в sum и инкремент счетчика i).
Не используйте без нужды операцию последования (,). Применение ее оправдано только при объединении одинаковых по смыслу выражений в основном в операторах циклов. Более широкое применение операции последования ухудшает читаемость кода, маскирует ошибки, усложняет сопровождение программы.