#44179 [Bgs]: Ternary Operator Does Not Accept Alpha Logical Operators
| From: | rpanning at hotmail dot com | Date: | Wed, 20 Feb 2008 20:17:18 +0000 |
| Subject: | #44179 [Bgs]: Ternary Operator Does Not Accept Alpha Logical Operators | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-122521@lists.php.net to get a copy of this message | ||
ID: 44179
User updated by: rpanning at hotmail dot com
Reported By: rpanning at hotmail dot com
Status: Bogus
Bug Type: Unknown/Other Function
Operating System: XP Pro SP2
PHP Version: 5.3CVS-2008-02-20 (snap)
New Comment:
I see what you are saying, "and", "or", and "xor" are lower than ? and
: so the expression goes with ? before "and". The entire ternary
operator is treated as one expression, not 3 divided by ? and : (as an
if/else expression).
I was starting to use "and" instead of && because of readability. It
seems odd that you cannot use "and" but I guess could be resolved with
parenthesis.
Maybe this should be noted in the documentation. Would help with
questions. Thanks
Previous Comments:
------------------------------------------------------------------------
[2008-02-20 17:44:07] rasmus@php.net
What do you mean why does it matter?
TRUE and TRUE ? 'True' : 'False'
when applying the precedence can be rewritten as:
TRUE and (TRUE ? 'True' : 'False')
which becomes
TRUE and 1
which equals 1
So it makes perfect sense, and no, 'and' and '&&' are obviously not
exactly the same. Why would we have two identical operators? They
differ in their precedence level as you have discovered. That lets you
do things like:
$a = $b + $c or fail();
Since the 'or' is of such low precedence the entire expression to the
left will be evaluated first and only if that expression is false will
the fail() function be called. If you used || instead then $c would be
OR'ed with the return value of the fail() function.
------------------------------------------------------------------------
[2008-02-20 14:03:20] rpanning at hotmail dot com
Why does the operator precedence matter? They still don't work.
Shouldn't "and" function the same as "&&"? The only time operator
precedence would matter is if there were multiple operators in the
expression. In this example there is only one for each expression, so
operator precedence shouldn't come into play.
------------------------------------------------------------------------
[2008-02-20 05:11:23] rasmus@php.net
Please check the operator precedence documentation. The whole point of
'and', 'or' and 'xor' is that they are right at the bottom of the
precedence table. Only the ',' operator is below them.
See: http://php.net/manual/en/language.operators.php
------------------------------------------------------------------------
[2008-02-20 04:30:35] rpanning at hotmail dot com
Description:
------------
It seems that the ternary conditional operator does not accept the text
logical operators (and, or, xor). They assign int 1 instead of the other
expressions.
The xor is even odder in that if the TRUE comes before the xor, it will
not assign anything. If it is the reverse, it will assign int 1.
Tested this with both PHP 5.2.5 and the latest snap of 5.3. Don't
believe this is the expected behavior.
Reproduce code:
---------------
$and = (TRUE and TRUE ? 'True' : 'False');
$or = (FALSE or TRUE ? 'True' : 'False');
$xor = (TRUE xor FALSE ? 'True' : 'False');
$aa = (TRUE && TRUE ? 'True' : 'False');
$ll = (TRUE || FALSE ? 'True' : 'False');
print('and = ' . $and . "<br>\r\n");
print('or = ' . $or . "<br>\r\n");
print('xor = ' . $xor . "<br>\r\n");
print('&& = ' . $aa . "<br>\r\n");
print('|| = ' . $ll . "<br>\r\n");
Expected result:
----------------
and = True<br>
or = True<br>
xor = True<br>
&& = True<br>
|| = True<br>
Actual result:
--------------
and = 1<br>
or = 1<br>
xor = <br>
&& = True<br>
|| = True<br>
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=44179&edit=1