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
Precedence of operators is an order of their interpretation by compiler, not the order of their execution.
Operator precedence actually means "where to put parentheses". Hence you are correct that
*p++
is the same as*(p++)
. But now we need to understand what is*(p++)
. It means taking*p
and then increasingp++
, because of post-fixed operation.So, in short, you just mixed order of interpretation by compiler (which is determined by parentheses or precedence) and order of execution (which is determined by post- or pre-fixed definition).
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.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++),