Например:
int foo(int i) { return i; }
int main()
{
int i = 0;
i = i++; // Undefined
i = foo(i++); // ?
return 0;
}
Что бы определить текущий стандарт ISO С++ для этого случая?
EDIT:
Здесь, где я запутался:
За исключением тех случаев, когда отмечено, оценки операндов отдельных операторов и подвыражений отдельных выражений не подвержены.
Если побочный эффект скаляра объект не влияет на какой-либо другой побочный эффект на один и тот же скалярный объект или вычисление значения используя значение одного и того же скалярного объекта, и они не являются потенциально параллельными (1.10), поведение undefined.
Во всех случаях назначение упорядочивается после значения вычисление правого и левого операндов и перед вычислением значения выражения присваивания
Каждая оценка в вызывающей функции (включая другие вызовы функций), которая иначе не является секвенированные до или после выполнения тела вызываемой функции, неопределенно секвенированы с в отношении выполнения вызываемой функции.
Итак, кажется, что вы можете вычислить значение в левой части задания (просто i
) и побочный эффект с правой стороны (модификация i
from i++
), которые не являются упорядоченные относительно друг друга.
EDIT2:
Для тех, кто оказался здесь, есть действительно отличное объяснение о последовательности, которую я нашел здесь.