Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Precedence of dereference and postfix

When I read the TCPL by K&R, I just couldn't understand two expressions:

*p++ = val;  /*push val onto stack */

Here is my idea:

  • dereference and postfix has the same precedence, and associativity is right to left,so

    *p++ = val maybe the same with *(p++) = val, because the pointer usually is the next position to the top , so in this code, p increase 1 first because of the parenthesis, so the p is the two units above the current top ,but not the one unit above the current top ,where the val should be!!! Thx

like image 772
skyline09 Avatar asked Mar 11 '13 18:03

skyline09


2 Answers

The prefix increment/decrement and dereference operators are equal precedence, but the postfix operator is higher, so *p++ is the same as *(p++), which is like writing *p = val; p++;

If you wrote (*p)++ = val, it wouldn't compile, as you'd be trying to assign a value to a number.

like image 159
teppic Avatar answered Oct 14 '22 04:10

teppic


Precedence and Associativity of Operators in K&R, table 2-1, pg 53, isn't as granular and complete as more recent table in Stroustrup, tC++PL,Sed, sec 6.2 Operator summary, p120-121.

C++ operator precedence Agnew's answer is excellent.

he points out association is indeed R->L for unary operators and that for *(p++),

  1. first p++ evaluates, but the previous p value is returned
  2. then *p is evaluated with this previous p value and the assignment occurs
  3. then the statement ends and p++ post increment value is now active, ie pointer p is now bumped.
like image 32
kwestphal Avatar answered Oct 14 '22 04:10

kwestphal