[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

Re: i = i++

Babu Kalakrishnan forced the electrons to say:
> A few days back exactly the same discussion came up in the 
> comp.lang.java.programmer newsgroup and there were some interesting comments
> about how Java & C treat such constructs.

This topic in fact comes up every so often on comp.lang.c. It is a FAQ
also, found at http://www.eskimo.com/~scs/C-faq/top.html.

> 2) In C & C++ the result is undefined which means results can vary depending
>    on compiler implementations.

Actually, there is a distinction between undefined and implementation
defined. If I have understood it correctly, the difference is that
implementation defined means that the implementation has to define
it in a consistent way, and has to document it, while undefined means
that implementations can do whatever they feel like (even change their
behaviour across compiler runs), without even documenting.

Coming back to the original question (even though it was about C++, I am
talking of C here), the C standard says, in section 6.5,

       [#2] Between the previous and next sequence point an  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.60)                                                   *

And the footnote 60 is:

       60)This paragraph renders  undefined  statement  expressions
          such as
                  i = ++i + 1;
                  a[i++] = i;
          while allowing
                  i = i + 1;
                  a[i] = i;

The standard is quite clear here that the original expression (i = i++;)
is undefined.