ID: 44179 Updated by: [EMAIL PROTECTED] 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:
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. Previous Comments: ------------------------------------------------------------------------ [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] [EMAIL PROTECTED] 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
