Instead the post-(in|de)crement
operators seem to be squireling away their value of $x when it came by them in a left to right evaluation
of the terms.
Post-increment and -decrement have to squirrel away their value of $x, because they change the value of $x in place but return the previous value.
Pre-increment and -decrement, on the other hand, change the value of $x in place and then return the new value. Returning a pointer to the location of $x, rather than to a copy of the value in $x, is an optimization.
Coming into the function x is 3, it gets pre-incremented (now 4), it's divided by x (still 4), x is
post-decremented (to 3). Print outputs 1 (4/4) and x leaving the function is 3. This is how it _should_
happen to my mind, instead it's 3/4 as stated earlier.
$x = 3;
You appear to have the order of evaluation all wrong. The operands to /, this case ++$x and $x--, must both be evaluated before
the division. What you describe sounds more like:
except, of course, that it's a syntax error.
By the way, you'll see the same results with other operations that modify variables in place, such as +=.
print $x, $x += 1;
Creating a separate copy of every value in every variable, to prevent such effects, would cost a lot in execution time and memory usage. It could also get very complicated with constructions like this:
print +(($x+=1)+=1) + ($x+=$x++);