#31285 [NEW]: something about operator precedence
| From: | geometer at ua dot fm | Date: | Fri, 24 Dec 2004 12:23:14 +0000 |
| Subject: | #31285 [NEW]: something about operator precedence | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-71039@lists.php.net to get a copy of this message | ||
From: geometer at ua dot fm
Operating system: *
PHP version: Irrelevant
PHP Bug Type: Math related
Bug description: something about operator precedence
Description:
------------
hello
it's not a bug, but an UNREASONABLE peculiarity of PHP (all versions).
the peculiarity may be a reason of "strange" behavior of a script and
errors may take a lot of time for their fixing.
i say about precedence of some operators. let's take a look on precedence
of bitwise operator "&" and comparison one "==".
let me need to find out is number of the lowest significant bits in $x is
less then 8 or not.
as it can be done in other programming languages, i use the following
construction:
if ($x&0x7f==$x) {ok} else {not ok}
if you try to use such a construction in a script you would be amazed,
because $x&0x7f==$x IS TRUE IF AND ONLY IF $x IS EQUAL TO 0x7f!
if you try to use 0x7f&$x==$x instead of original condition, you would be
amazed twice, because 0x7f&$x==$x IS ALWAYS TRUE.
and what the reason of this tricks? the reason is the precedence of "&" is
LOWER than one of "==".
so, i HAVE to write ($x&0x7f)==$x or (0x7f&$x)==$x, because
taking into account the precedence one obtains:
$x&0x7f==$x <=> $x&(0x7f==$x)
0x7f&$x==$x <=> 0x7f&($x==$x)
such behavior is not common in programming and in mathematics. and even if
i aware about the precedence, i can make a mistake "on the fly" in
expression (do you like to print additional parenthesis? ;)).
so, what's the reason of such particuliarly in PHP?
may be it needs to be removed from the following releases?
Reproduce code:
---------------
<?
$x = 0x76;
echo $x&0x7f==$x;
echo "\n";
echo 0x7f&$x==$x;
?>
Expected result:
----------------
1
1
Actual result:
--------------
0
1
--
Edit bug report at http://bugs.php.net/?id=31285&edit=1
--
Try a CVS snapshot (php4): http://bugs.php.net/fix.php?id=31285&r=trysnapshot4
Try a CVS snapshot (php5.0): http://bugs.php.net/fix.php?id=31285&r=trysnapshot50
Try a CVS snapshot (php5.1): http://bugs.php.net/fix.php?id=31285&r=trysnapshot51
Fixed in CVS: http://bugs.php.net/fix.php?id=31285&r=fixedcvs
Fixed in release: http://bugs.php.net/fix.php?id=31285&r=alreadyfixed
Need backtrace: http://bugs.php.net/fix.php?id=31285&r=needtrace
Need Reproduce Script: http://bugs.php.net/fix.php?id=31285&r=needscript
Try newer version: http://bugs.php.net/fix.php?id=31285&r=oldversion
Not developer issue: http://bugs.php.net/fix.php?id=31285&r=support
Expected behavior: http://bugs.php.net/fix.php?id=31285&r=notwrong
Not enough info: http://bugs.php.net/fix.php?id=31285&r=notenoughinfo
Submitted twice: http://bugs.php.net/fix.php?id=31285&r=submittedtwice
register_globals: http://bugs.php.net/fix.php?id=31285&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=31285&r=php3
Daylight Savings: http://bugs.php.net/fix.php?id=31285&r=dst
IIS Stability: http://bugs.php.net/fix.php?id=31285&r=isapi
Install GNU Sed: http://bugs.php.net/fix.php?id=31285&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=31285&r=float
No Zend Extensions: http://bugs.php.net/fix.php?id=31285&r=nozend
MySQL Configuration Error: http://bugs.php.net/fix.php?id=31285&r=mysqlcfg