Yes it's undefined behavior - a
and foo(--a)
can be evaluated in any order.
For further reference, see e.g. Sequence Point. There's a sequence point after the complete expression, and after evaluation of the argument to foo
- but the order of evaluation of subexpressions is unspecified, per 5/4:
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 previous
and next sequence point a scalar
object shall have its stored value
modified at most once by the
evaluation of an expression.
Furthermore, 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 expression;
otherwise the behavior is undefined.
EDIT: As Prasoon points out, the behavior is unspecified due to the order of evaluation ... is unspecified., and becomes undefined due to the prior value shall be accessed only to determine the value to be stored