Bug #61188 [Nab]: Assignment changes order of evaluation of binop expression
| From: | cataphract@php.net | Date: | Sun, 26 Feb 2012 19:22:56 +0000 |
| Subject: | Bug #61188 [Nab]: Assignment changes order of evaluation of binop expression | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-167866@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=61188&edit=1
ID: 61188
Updated by: cataphract@php.net
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 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
Previous Comments:
------------------------------------------------------------------------
[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] rasmus@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] rasmus@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);
------------------------------------------------------------------------
[2012-02-26 18:35:21] antickon at gmail dot com
I'm afraid you're mistaken. The brackets denote a change in expression binding,
not evaluation order. If what you are saying is true
<?php
function a(){echo 'a';}
function b(){echo 'b';}
a() == (b());
would output ba since the bracketed expression would be evaluated first. However
it (correctly) outputs ab.
In fact, the brackets are completely irrelevant. I added them for clarity.
Consider the equivalent example:
<?php
$a = 3;
var_dump( $a == $a = 3 );
------------------------------------------------------------------------
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