When according to the rules operation * is to be counted before +, and ++ before *, it will be so. 
 a*b++ + c // first b++ (returns **old** b), than a*b, than ...+c
But when you have a++ * a--, nobody can tell, what of the two operands, a++ or a-- will be evaluated the first. According to ANSII standard, even if you use the same translator, the result is every time unpredictable. 
cite from the C++ ANSII standard:
Except where noted, the order of evaluation of operands of  individual
  operators  and subexpressions of individual expressions, and the order
  in which side effects take place, is unspecified.  Between the  previ-
  ous  and  next  sequence  point  a scalar object shall have its stored
  value modified at most once by the evaluation of an expression.   Fur-
  thermore,  the  prior  value  shall  be accessed only to determine the
  value to be stored.  The requirements of this paragraph shall  be  met
  for  each  allowable  ordering of the subexpressions of a full expres-
  sion; otherwise the behavior is undefined.  [Example:
      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
Sequence points:
- at the end of the evaluation of a full expression (a full expression is an expression statement, or any other expression which is not a subexpression within any larger expression);
- at the ||, &&, ?:, and comma operators; 
- and at a function call (after the evaluation of all the arguments, and
just before the actual call).
So, || is a sequence point, but << is not.