Я посмотрел на кучу вопросов о точках последовательности и не смог выяснить, гарантирован ли порядок оценки для x*f(x)
, если f
изменяет x
, и это отличается для f(x)*x
.
Рассмотрим этот код:
#include <iostream>
int fx(int &x) {
x = x + 1;
return x;
}
int f1(int &x) {
return fx(x)*x; // Line A
}
int f2(int &x) {
return x*fx(x); // Line B
}
int main(void) {
int a = 6, b = 6;
std::cout << f1(a) << " " << f2(b) << std::endl;
}
Отпечатает 49 42
в g++ 4.8.4 (Ubuntu 14.04).
Мне интересно, гарантировано ли это поведение или неуказано.
В частности, в этой программе fx
вызывается дважды, с x=6
оба раза и возвращает 7 обоих раз. Разница в том, что Line A вычисляет 7 * 7 (принимая значение x
после возврата fx
), в то время как Line B вычисляет 6 * 7 (принимая значение x
до возврата fx
).
Это гарантированное поведение? Если да, то какая часть стандарта указывает это?
Также: если я изменю все функции, чтобы использовать int *x
вместо int &x
и внести соответствующие изменения в те места, из которых они вызваны, я получаю код C
, который имеет те же проблемы. Является ли ответ другим для C?