Оператор запятой по очереди оценивает аргументы, а затем возвращает последнее вычисленное выражение. То есть если у вас был следующий код
int four = 2 + 2, mul(2,2), 4;
неоптимизирующий компилятор строго следующих за спецификацией сначала добавил бы 2 и 2, а затем отбросил бы результат, затем вызвал функцию mul
и отбросил возвращаемое значение и, наконец, оценил 4, который затем назначается i
переменная.
Обратите внимание, что после каждой запятой есть точка последовательности , поэтому
все побочные эффекты предыдущих оценок будут выполнены. Например. в
ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);
присвоение inhi
выполнено и завершено до обновления ihi
. И это также означает, что компилятор не может оптимизировать вызов mul
в приведенном выше примере, если он не знает на 100% наверняка, что функция mul
не имеет никаких побочных эффектов, кроме возврата значения. Обычно это не то, что знает компилятор, хотя в C ++ можно пометить функции как const
, с помощью которых компилятору сообщают об этом.