This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Question for ISO C standards gurus
Diego Novillo <dnovillo@redhat.com> writes:
> On Thu, 2004-03-25 at 13:08, Dave Korn wrote:
>
> > "Here is the complete list of all sequence points in C++:
> >
> > at the end of a full expression
> >
> > after the evaluation of all function arguments in a function call and before
> > execution of any expressions in the function body
> >
> > after copying of a returned value and before execution of any expressions
> > outside the function
> >
> > after evaluation of the first expression in a&&b, a||b, a?b:c, or a,b
> >
> > after the initialization of each base and member in the constructor
> > initialization list "
> >
> So, the program below should print 5? It certainly doesn't with gcc 3.2
> nor mainline:
>
> int foo (int x)
> {
> return x;
> }
>
> main ()
> {
> int *p;
> int a[2];
> a[0] = 4;
> a[1] = 5;
> p = a;
> printf ("%d\n", foo (*p++));
> }
>
> It will print 5 if I use pre-increment on 'p', which is what I would've
> expected (I'm no language lawyer, though).
I can't see any reason why that would print 5. Based on the above, p
should be incremented before the function call to foo(). But that
doesn't change the value of *p++, which means "get the value at *p,
then increment p". The above just means that this should not happen:
t1 = *p;
foo (t1);
p = p + 1;
(at least, it should not be possible to observe that that happened; in
the above program, p, as a local variable whose address is not taken,
probably could be incremented after the function call, since there is
no way for anything to detect when the increment occurred.)
Ian