Re: syntax for two comparison operators

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, August 24, 2005 6:10 pm, Jordan Miller wrote:
> Is there a technical reason why PHP does not allow comparison
> operator expressions like the following:
>
> if (2 < $x <= 4) {}

2 < $x <= 4 is a valid expression already.

2 < $x is evaluated first, and returns true/false

true/false is compared with 4 using <= and will always return TRUE,
since true/false will get typecast to 0/1 in order for the comparison
to be made.

At least, I THINK that's what will happen... Not sure on the
type-casting of something that I'd never code in the first place.

At any rate, it's already valid under current syntax, so you'd have a
HUGE backwards incompatibility issue to change it.

>  From what I can tell, this expression can currently only be written
> as:
>
> if ( $x > 2 && $x <= 4) {}

I personally would use:

((2 < $x) && ($x <= 4))

Yes, the extra parens are kinda bogus -- But they visually separate
the two tests.

Putting the 2, $x, and 4 in order is similar to the 2 < x <= 4
Algebraic notation.

It wouldn't bug me to see 2 < $x && $x <= 4, mind you.

In code I've read/written, it's seldom been a real problem.

In fact, if the author is CONSISTENT in their ordering, and SYSTEMATIC
in their tests/conditions/expressions, it doesn't even really matter
to me if they use 2 < $x && $x <= 4 or $x > 2 && $x <= 4, so long as
it's the same way in all their code.

> Would adding this syntax to PHP be incredibly difficult or lead to
> performance slowdowns?

Probably not incredibly difficult, per se, and performance would not
suffer in any measurable way...

You'd just break a few zillion existing scripts that, whether the
authors know it or not, rely on the current behaviour.

I suspect it would also unearth a large number of previously
un-noticed bugs :-)

> I think I remember reading that PHP always evaluates expressions from
> right to left,

If you did read that, it was a REALLY BAD thing to have been written
by anybody anywhere. :-)

[Maybe that goof that decided PHP wasn't ready for Enterprise use we
were discussing a couple days ago.  He was great at writing FACTUALLY
INCORRECT statements to shore up his pathetic arguments. :-)]

PHP has a very precise order of operations with Operater Precedence:

http://php.net/manual/en/language.operators.php#language.operators.precedence

In fact, some of those are VERY common pitfalls for newbies.

&& || versus AND OR often trips up beginning scripters.

Not only does PHP not always evaluate from left-to-right due to
precedence, even within the precedence ordering, some operators are
right-to-left associative:

$x = 2;
$y = 5;
$x = $y = 3;

Here we have a "tie" in order of operations between two assignment
operators.

Since = is RIGHT associative, the tie-breaker is to read from RIGHT to
LEFT and do the operations in this order:
$y = 3;
$x = $y;

So both $x and $y are 3.

[WRONG]
If = were LEFT associative, which it's NOT, you'd end up with $x being
5 and $y would still be 3:
$x = $y;
$y = 3;
[/WRONG]

'Course, $x = $y = 3; is probably Bad Practice anyway...

Though I guess I've seen:
$x = $y = $z = 0;
at the top of enough functions to understand and accept that it's a
convenient way to initalize all three variables to 0...

I don't LIKE it, but I can live with it.

> so I guess there may be a considerable codebase change
> required. Maybe there could be a default function workaround for this
> or some other way to automagically process these more concise
> expressions without too much of a slowdown?? Just curious.

You could maybe check with PHP-Internals to see if they believe that
nobody's relying on the current behaviour with < > <= >=, and then
there's no problem adding it, but I wouldn't get yer hopes up.

PS  Is (2 < $x >= 0) a syntax error, or would you allow that silly
expression? :-)

-- 
Like Music?
http://l-i-e.com/artists.htm

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux