Re: [PHP-DEV] Possible problem in the parser

[email protected] ((Marcus Börger)) Wed, 12 Mar 2003 19:35:31 +0100
Newsgroups php.dev
Message-ID <[email protected]>
At 18:42 12.03.2003, Derick Rethans wrote:
>On Wed, 12 Mar 2003, Andrey Hristov wrote:
>
> >  Few minutes ago I found the following behaviour somehow wierd for me :
> > <?php
> >     $a = 1;
> >     $b = $a==1? 4:$a==2? 5:6;
> >     printf("a[%d]b[%d]\n", $a, $b);
> > ?>
> > Prints :
> > a[1]b[5]
> >
> > Similar C program :
> > main()
> > {
> >     int a,b;
> >     a = 1;
> >     b = a==1? 4:a==2? 5:6;
> >     printf("a[%d]b[%d]\n", a, b);
> > }
> > Prints :
> > a[1]b[4]
> >
> > -=-=-=-=-=-
> > I think that the behavior of the C program is the right
>
>It's just a different operator precedence; it's not really wrong, just
>different.


Where is the different precednece here? I can only find an error.
Lets support parantesis:

ALL BUT PHP)  '==' has higher precedence than '?:'

((a==1) ? 4 : ((a==2) ? 5 : 6))  => (1) ? 4 : ((0) ? 5 : 6) => 1 ? 4 : 6 => 4

PHP?) '?:' has higher precedence than '=='

(a == (1 ? 4 : a) == (2 ? 5 : 6))

( a == (4) == (5))

Now what? Assume order left from to right: ( (a == (4)) == (5) => (0 == 5) => 0

Or right to left (which contradicts rest of PHP behavior): ( a == ((4) == 
(5))) => (a == 0) => 0

Result: This is (to say it in german "mumpitz") wrong.

So lets fix it.

marcus