+5

Quiz query, $d.$d--=20?

$d = 5; echo $d*$d--; The answer I believed was 25 but apparently it is 20. To try debugging, I did: echo $d.$d--; And I get 45. 5*4 alone is confusing for post decrement. Why is it 4*5? Can someone explain? Thanks!

4/5/2019 10:25:42 AM

Prometheus

10 Answers

New Answer

+8

The $d-- is being evaluated first so it's actually 4 * 5. I tried to find this is the documentation and it seems this is undefined behavior so I wouldn't rely on it always working this way.

+3

https://www.php.net/manual/en/language.operators.precedence.php#example-96

+3

Ipang you did it right, it took me a while too, to figure that out in C

+3

Ipang maybe test em all the time before use, in a different language, with time you won't need that again

+2

This is really odd, we commonly understood postfix operator doesn't change the operand's value at least until the next statement line was executed. It's funny how PHP treats postfix & prefix operator the same. I'm looking forward to hearing something about this odd behaviour. $d = 5; echo '$d * $d++ = ' . $d * $d++ . '<br>'; // output: 30 $d = 5; echo '$d * ++$d = ' . $d * ++$d . '<br>'; // output: 36 ?>

+2

Ipang I think it's working from right to left just like in C when you put such in a printf function ⚡Prometheus ⚡ this is probably the case

+1

So I did a little test on different languages, and found that this operator associativity is shared amongst C, C++ and PHP. Java, C# and JavaScript seems to have different way in determining associativity and thus different output. I guess we just need to be more careful with this difference.

+1

*AsterisK* Out of curiosity I tested printing the results of the following expressions in several languages (in Code Playground) and I got different results: * Note before every evaluation <d> = 5 1. (d * d++) C, C++, PHP => 30 Java, C#, JS => 25 2. (d * ++d) C, C++, PHP => 36 Java, C#, JS => 30 3. (d * d--) C, C++, PHP => 20 Java, C#, JS => 25 4. (d * --d) C, C++, PHP => 16 Java, C#, JS => 20 I seem to get the impression that C, C++ and PHP does associativity evaluation differently with Java, C# and JavaScript. Or maybe I wasn't doing it right that the output differs.

+1

*AsterisK* I'm having difficulty when it comes to evaluating expressions, especially now that I'm aware of this various operator associativity evaluation from different languages, wish there was a way to easily remember which language does it how 😁

+1

*AsterisK* Good idea, I'll keep a note on this for future. Thanks mate 👍