Edit report at https://bugs.php.net/bug.php?id=61188&edit=1
ID: 61188 Updated by: [email protected] 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: 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); Previous Comments: ------------------------------------------------------------------------ [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 ); ------------------------------------------------------------------------ [2012-02-26 18:16:37] [email protected] You are outsmarting yourself here. Look at your brackets. $a == ($a=4) So we do the bracketed expression first: $a=4 which sets $a to 4 obviously and returns the value 4. So what are we left with? $a == 4 But what is $a at this point? Well, it is 4 of course, because we just set it. So we have: 4 == 4 If you can find a language where this expression doesn't return true, regardless of the initial value of $a, then you should file a bug against that language. ------------------------------------------------------------------------ [2012-02-26 17:54:18] antickon at gmail dot com Description: ------------ An assignment expression can change the order of operation for == and != (and possibly other binops) Test script: --------------- <?php $a = 3; var_dump( $a == ( $a = 4 ) ); Expected result: ---------------- bool(false) evaluation of $a == ( $a = 4 ) should be as follows: left side of the comparison is evaluated (evaluates to 3) right side of the comparison is evaluated (4 is assigned to $a, evaluates to 4) 3 == 4 finally evaluates to false Actual result: -------------- bool(true) ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=61188&edit=1
