23 nothing is so as it seems, but why

php.internals

Marco Kaiser

20 years ago
Today during a session i had a strange "magic" feature found in php. <?php $a = 10; echo ++$a + $a++; ?> this works perfect as expected. it returns 22. but if i assign $a as a ref. to another variable it will be return 23. <? $a = 10; $b = &$a; echo ++$a + $a++; ?> this will gave me to 23 (used the $b to the pre post stuff) <? $a = 10; $b = &$a; echo ++$b + $b++; ?> this just happens if i have a ref. count to my var. WHY? :) http://en.wikipedia.org/wiki/23_%28film%29
-- Marco Kaiser

Hartmut Holzgraefe

20 years ago
Marco Kaiser wrote:
> Today during a session i had a strange "magic" feature found in php. > > <?php > $a = 10; > echo ++$a + $a++; > ?>
there is a very simple rule that PHP inherited from C: never use pre- and postfix increment operators in the same expression as the results are undefined
-- Hartmut Holzgraefe, Senior Support Engineer . MySQL AB, www.mysql.com

Etienne Kneuss

20 years ago
Notice that this behavior can be reproduced using only prefix increment operators. <?php $a = 10; $b = &$a; echo (++$a) + (++$a); // 24 ?> <?php $a = 10; //$b = &$a; echo (++$a) + (++$a); // 23 ?> Is that also expected to give undefined results ? Best regards Hartmut Holzgraefe a écrit :
> Marco Kaiser wrote: >> Today during a session i had a strange "magic" feature found in php. >> >> <?php >> $a = 10; >> echo ++$a + $a++; >> ?> > > there is a very simple rule that PHP inherited from C: > > never use pre- and postfix increment operators in the same expression > > as the results are undefined >
-- Etienne Kneuss http://www.colder.ch/ colder@php.net

Christian Schneider

20 years ago
Etienne Kneuss wrote:
> Notice that this behavior can be reproduced using only prefix increment > operators. > > Is that also expected to give undefined results ?
Yes, see <http://en.wikipedia.org/wiki/C_syntax#Undefined_behavior> - Chris

Marcus Börger

20 years ago
Hello Marco, though Hartmut is perfectly correct in his statement here's what happens: $a = 10; // 10 ++$a // 11 $a + $a // 22 $a++ // 23 Thursday, January 19, 2006, 5:41:17 PM, you wrote:
> Today during a session i had a strange "magic" feature found in php.
> <?php > $a = 10; > echo ++$a + $a++;
?>> just to verfiy echo $a after your echo line, it will show 12
> this works perfect as expected. it returns 22. > but if i assign $a as a ref. to another variable it will be return 23.
> <? > $a = 10; > $b = &$a; > echo ++$a + $a++;
?>>
> this will gave me to 23 > (used the $b to the pre post stuff)
> <? > $a = 10; > $b = &$a; > echo ++$b + $b++;
?>>
> this just happens if i have a ref. count to my var. WHY? :)
> http://en.wikipedia.org/wiki/23_%28film%29
> -- > Marco Kaiser
Best regards, Marcus

Marco Kaiser

20 years ago
Hmm yes i know this, but its very interesting for me to see how php internaly handles ++$a with a pointer. Now i understand it :) -- Marco 2006/1/19, Marcus Boerger <helly@php.net>:
> > Hello Marco, > > though Hartmut is perfectly correct in his statement here's what > happens: > > $a = 10; // 10 > ++$a // 11 > $a + $a // 22 > $a++ // 23 > > Thursday, January 19, 2006, 5:41:17 PM, you wrote: > > > Today during a session i had a strange "magic" feature found in php. > > > <?php > > $a = 10; > > echo ++$a + $a++; > ?>> > > just to verfiy echo $a after your echo line, it will show 12 > > > this works perfect as expected. it returns 22. > > but if i assign $a as a ref. to another variable it will be return 23. > > > <? > > $a = 10; > > $b = &$a; > > echo ++$a + $a++; > ?>> > > > this will gave me to 23 > > (used the $b to the pre post stuff) > > > <? > > $a = 10; > > $b = &$a; > > echo ++$b + $b++; > ?>> > > > this just happens if i have a ref. count to my var. WHY? :) > > > http://en.wikipedia.org/wiki/23_%28film%29 > > > -- > > Marco Kaiser > > > > Best regards, > Marcus > >
-- Marco Kaiser

Jani Taskinen

20 years ago
For the 2nd time: references ARE NOT POINTERS! :-p --Jani On Thu, 19 Jan 2006, Marco Kaiser wrote:
> Hmm yes i know this, > but its very interesting for me to see how php internaly handles ++$a with a > pointer. > Now i understand it :) > > -- Marco > > 2006/1/19, Marcus Boerger <helly@php.net>: >> >> Hello Marco, >> >> though Hartmut is perfectly correct in his statement here's what >> happens: >> >> $a = 10; // 10 >> ++$a // 11 >> $a + $a // 22 >> $a++ // 23 >> >> Thursday, January 19, 2006, 5:41:17 PM, you wrote: >> >>> Today during a session i had a strange "magic" feature found in php. >> >>> <?php >>> $a = 10; >>> echo ++$a + $a++; >> ?>> >> >> just to verfiy echo $a after your echo line, it will show 12 >> >>> this works perfect as expected. it returns 22. >>> but if i assign $a as a ref. to another variable it will be return 23. >> >>> <? >>> $a = 10; >>> $b = &$a; >>> echo ++$a + $a++; >> ?>> >> >>> this will gave me to 23 >>> (used the $b to the pre post stuff) >> >>> <? >>> $a = 10; >>> $b = &$a; >>> echo ++$b + $b++; >> ?>> >> >>> this just happens if i have a ref. count to my var. WHY? :) >> >>> http://en.wikipedia.org/wiki/23_%28film%29 >> >>> -- >>> Marco Kaiser >> >> >> >> Best regards, >> Marcus >> >> > > > -- > Marco Kaiser >
-- Give me your money at @ <http://pecl.php.net/wishlist.php/sniper> Donating money may make me happier and friendlier for a limited period! Death to all 4 letter abbreviations starting with P!

Marco Kaiser

20 years ago
Sorry Jani, i mean a reference (alias) :) -- Marco 2006/1/19, Jani Taskinen <sniper@iki.fi>:
> > > For the 2nd time: references ARE NOT POINTERS! :-p > > --Jani > > > On Thu, 19 Jan 2006, Marco Kaiser wrote: > > > Hmm yes i know this, > > but its very interesting for me to see how php internaly handles ++$a > with a > > pointer. > > Now i understand it :) > > > > -- Marco > > > > 2006/1/19, Marcus Boerger <helly@php.net>: > >> > >> Hello Marco, > >> > >> though Hartmut is perfectly correct in his statement here's what > >> happens: > >> > >> $a = 10; // 10 > >> ++$a // 11 > >> $a + $a // 22 > >> $a++ // 23 > >> > >> Thursday, January 19, 2006, 5:41:17 PM, you wrote: > >> > >>> Today during a session i had a strange "magic" feature found in php. > >> > >>> <?php > >>> $a = 10; > >>> echo ++$a + $a++; > >> ?>> > >> > >> just to verfiy echo $a after your echo line, it will show 12 > >> > >>> this works perfect as expected. it returns 22. > >>> but if i assign $a as a ref. to another variable it will be return 23. > >> > >>> <? > >>> $a = 10; > >>> $b = &$a; > >>> echo ++$a + $a++; > >> ?>> > >> > >>> this will gave me to 23 > >>> (used the $b to the pre post stuff) > >> > >>> <? > >>> $a = 10; > >>> $b = &$a; > >>> echo ++$b + $b++; > >> ?>> > >> > >>> this just happens if i have a ref. count to my var. WHY? :) > >> > >>> http://en.wikipedia.org/wiki/23_%28film%29 > >> > >>> -- > >>> Marco Kaiser > >> > >> > >> > >> Best regards, > >> Marcus > >> > >> > > > > > > -- > > Marco Kaiser > > > > -- > Give me your money at @ <http://pecl.php.net/wishlist.php/sniper> > Donating money may make me happier and friendlier for a limited period! > Death to all 4 letter abbreviations starting with P! >
-- Marco Kaiser

Jon Dowland

20 years ago
On Thu, Jan 19, 2006 at 06:41:17PM +0200, Marco Kaiser wrote:
> Today during a session i had a strange "magic" feature found in php. > > <?php > $a = 10; > echo ++$a + $a++; > ?> > > this works perfect as expected. it returns 22.
Odd, I expected 21: echo (11 + 10) a = a + 1
-- Jon Dowland http://alcopop.org/

Carl P. Corliss

20 years ago
Jon Dowland wrote:
> On Thu, Jan 19, 2006 at 06:41:17PM +0200, Marco Kaiser wrote: > >>Today during a session i had a strange "magic" feature found in php. >> >><?php >>$a = 10; >>echo ++$a + $a++; >>?> >> >>this works perfect as expected. it returns 22. > > > Odd, I expected 21: > echo (11 + 10) > a = a + 1 >
nope - discounting the 'undefined behavior' of using pre/post increment operators, 22 would be the correct assumption - remember, broken into seperate statements, it's effectively: $a = 10; $a = $a + 1; // $a == 11 $a + $a; // $a == 22 echo $a; $a = $a + 1; // $a == 23 Cheers,
-- Carl

Andi Gutmans

20 years ago
Guys, please take this offlist. Undefined means undefined. There's no assumed way of it working. Andi At 07:14 AM 1/20/2006, Carl P. Corliss wrote: