Edit report at https://bugs.php.net/bug.php?id=61188&edit=1
ID: 61188 User updated by: antickon at gmail dot com Reported by: antickon at gmail dot com Summary: Assignment changes order of evaluation of binop expression Status: Not a bug Type: Bug Package: Variables related Operating System: linux PHP Version: 5.3.10 Block user comment: N Private report: N New Comment: I assumed subexpression evaluation should be strictly left-to-right. But you are right, it is actually not guaranteed either way. Thanks for pointing that out. I believe it should be guaranteed strictly left-to-right, but that's just my opinion. Proper programming practice (PrPrPr (TM)) would be not to compare expressions with side-effects anyway. PS. I put that comment under the page on expressions rather than the one on operator precedence http://www.php.net/manual/en/language.expressions.php Previous Comments: ------------------------------------------------------------------------ [2012-02-26 19:22:56] cataphr...@php.net I think the point here is that we make no guarantee about the order of evaluation (or apparent order, as the implementation may just be checking whether the same variable is both sides; I haven't checked), just as C doesn't. Can you point to any place on the documentation where it's stated that the first operand is evaluated first? Not that this is particularly relevant, but the only language I tried where the behavior is what you expect is Mathematica (a = 3; (a = 4) == a is True and a = 3; a == (a = 4) is False), but it documents this behavior in http://reference.wolfram.com/mathematica/tutorial/TheStandardEvaluationProcedure .html ------------------------------------------------------------------------ [2012-02-26 19:18:48] antickon at gmail dot com I suppose it is up to you to implement undocumented behavior as you see fit, however peculiar it is. I'll post a comment on the operator precedence page to document it though. Fyi, I tested this in Javascript and Java and they both evaluate strictly left- to-right. ------------------------------------------------------------------------ [2012-02-26 19:04:44] ras...@php.net I do see your argument, but you are making assumptions about how PHP handles sequence points in expressions which is not documented and thus not stricly defined. ------------------------------------------------------------------------ [2012-02-26 19:00:09] antickon at gmail dot com What C or perl does is not the issue. The PHP documentation on operator precedence states parentheses force precedence, not evaluation order of subexpressions. You are saying that arbitrarily changing evaluation order depending on the type of subexpression is correct behavior. You have not yet provided any rational justification for this behavior, except that C and perl also behave this way. ------------------------------------------------------------------------ [2012-02-26 18:38:39] ras...@php.net Then C/C++/Perl and the other C-like languages are all wrong as well then. Try this in C: #include <stdio.h> int main(char *argv[], int argc) { int a=3; printf("%d\n",(a==(a=4))); } Or this in Perl: $a=3; print $a==($a=4); ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=61188 -- Edit this bug report at https://bugs.php.net/bug.php?id=61188&edit=1