Когда согласно правилам операция * должна быть посчитана до +, а ++ до *, это будет так.
a*b++ + c // first b++ (returns **old** b), than a*b, than ...+c
Но когда у вас есть ++ * a--, никто не может сказать, какой из двух операндов, a ++ или a--, будет вычислен первым.Согласно стандарту ANSII, даже если вы используете один и тот же переводчик, результат каждый раз непредсказуем.
цитата из стандарта C ++ ANSII:
За исключением особо отмеченных случаев, порядок вычисления операндов отдельных операторов и подвыражений отдельных выражений, а также порядок возникновения побочных эффектов не определен.,Между предыдущей и следующей точкой последовательности скалярному объекту должно быть сохранено его значение, измененное не более одного раза при оценке выражения.Кроме того, предварительное значение должно быть доступно только для определения значения, которое будет сохранено.Требования этого параграфа должны выполняться для каждого допустимого упорядочения подвыражений полного выражения;в противном случае поведение не определено.[Пример:
i = v[i++]; // the behavior is undefined
i = 7, i++, i++; // `i' becomes 9
i = ++i + 1; // the behavior is undefined
i = i + 1; // the value of 'i' is incremented
Точки последовательности:
- в конце вычисления полного выражения (полное выражение - это выражение выражения или любое другое выражение, которое не являетсяподвыражение в любом большем выражении);
- в операторах ||, &&,?: и запятых;
- и при вызове функции (после оценки всех аргументов и непосредственно перед фактическим вызовом).
Итак, ||является точкой последовательности, но << нет.</p>