Associativity -- what is it?

Larry Jones scjones at sdrc.UUCP
Wed Feb 24 12:21:25 AEST 1988


In article <234 at mccc.UUCP>, pjh at mccc.UUCP (Peter J. Holsberg) writes:
> In article <224 at sdrc.UUCP> scjones at sdrc.UUCP (Larry Jones) writes:
> |In article <226 at mccc.UUCP>, pjh at mccc.UUCP (Peter J. Holsberg) writes:
> |> 
> |> I find that associativity is a *very* difficult thing for me to explain,
> |> undoubtedly because I don't understand it!  Would someone come to my
> |> rescue?  Here's an example (assume that everything's been declared
> |> correctly):
> |> 
> |> 	x = 3 * i ++;
> |> 
> |> Book says that ++ has a higher precedence than *, and that ++
> |> associates from R->L.  That makes me think that ++ should be applied
> |> first, but I know it isn't.  But ????
> |
> |But ++ IS applied first!  The key point here is that the RESULT of postfix
>                                                           ^^^^^^^^^^^^^^^^^
> |++ is the value BEFORE incrementation, not that postfix ++ is somehow deferred
>  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> |until later.
> 
> Well, that still leaves me confused.  If i has the value 7, it is 7 that
> is added to 3, so it seems to be that the ++ *is* deferred until later. 
> Also, ++ has higher precedence than +, so why is the incrementation
> delayed until after the current value of i is used?

The result of i++ is the value of i.  In addition, i gets incremented.  You
can think of i++ as being like inc(&i) where inc() is defined as:

   int inc(ip)
      int *ip;
      {
      int j = *i;
      *i = *i + 1;
      return j;
      }

So, it's not the ++ operator that's defered, it's the side effect of the
incrementation.  You should also be aware that the incrementation can be
defered for a long time - it may not happen until after the assignment.
That's why i = i++ + 2; has no defined value -- you don't know whether the
incrementation is done before or after the assignment.

> I think we're getting close, though.  :-)  Thanks for the help.

Hope this clears it up for good.

----
Larry Jones                         UUCP: uunet!sdrc!scjones
SDRC                                MAIL: 2000 Eastman Dr., Milford, OH  45150
                                    AT&T: (513) 576-2070
"When all else fails, read the directions."



More information about the Comp.lang.c mailing list