Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

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++);


Comment on Re: Re: Re: Re: Re: For loop problem
Select or Download Code
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?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://85392]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (8)
As of 2015-07-01 23:22 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (25 votes), past polls