On 10 mai, 10:34, brno <brno.barutc...@[EMAIL PROTECTED]
> wrote:
> James Kanze dixit:
> > On May 9, 2:54 am, "Victor Bazarov" <v.Abaza...@[EMAIL PROTECTED]
> wrote:
> >> Ian Collins wrote:
> >>> bintom wrote:
> >>>> Is there any reason why the following C++ code behaves as it does ?
> >>>> int i;
> >>>> i=3D1; cout << (++i)++; Output: 2
> >>> Because it's nonsensical undefined behaviour.
> >> Why is it non-sensical? Why is it undefined?
> > Because the standard says so. You're modifying the same object
> > twice without an intervening sequence point.
> Can you tell what is an intervening sequence point ?
A sequence point that is guaranteed to occur between the two
operations.
In your example, the only sequence points are the ends of each
full expression, and the call and return from the
ostream::operator<<( int ) function. There's nothing between
the ++i (which modifies i), and the (x)++ (where 'x' is the
result of ++i, i.e. i), which also modifies i.
Note that if i was a type with a user defined operator++, the
code would be well defined, since the user defined operator++ is
a function, and both the function call and the return are
sequence points. Note too, however, that sequence points do not
always create a complete ordering: in something like 'f(++i) +
g(++i)', there are still no sequence points between the two
incrementations, so the code has undefined behavior.
--
James Kanze (GABI Software) email:james.kanze@[EMAIL PROTECTED]
en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34


|