Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight

Re: Re: Re: Re: Re: For loop problem

by chipmunk (Parson)
on Jun 04, 2001 at 06:05 UTC ( #85392=note: print w/replies, xml ) Need Help??

in reply to Re: Re: Re: Re: For loop problem
in thread For loop problem

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.

$x = 3; print ++$x/$x--;
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.
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: (++$x/$x)--
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++);

Replies are listed 'Best First'.
Re: Re: Re: Re: Re: Re: For loop problem
by Arguile (Hermit) on Jun 04, 2001 at 06:41 UTC
    "You appear to have the order of evaluation all wrong."

    Sorry, I should have been more precise. What I was emphasising was that $x-- was still 4 (as it returned the previous value), not that it didn't occur before the division.

    Thanks for pointing out the pointers {g}. I understood the refference passing, I was just getting hung up on left to right evaluation as if it were a stream; not the line completely evaluated, then all the pointer calls.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://85392]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (6)
As of 2017-01-22 14:55 GMT
Find Nodes?
    Voting Booth?
    Do you watch meteor showers?

    Results (187 votes). Check out past polls.