次のステートメントの結果は9を与えるはずです:(javaまたはjsまたはc++を使用して)
i = 1;
i += ++i + i++ + ++i;
//i = 9 now
しかし、PHPでは
同じステートメントは12を与えますか?!
$i = 1;
$i += ++$i + $i++ + ++$i;
echo $i;
これはバグですか、それとも誰かが理由を説明できますか?
次のステートメントの結果は9を与えるはずです:(javaまたはjsまたはc++を使用して)
i = 1;
i += ++i + i++ + ++i;
//i = 9 now
しかし、PHPでは
同じステートメントは12を与えますか?!
$i = 1;
$i += ++$i + $i++ + ++$i;
echo $i;
これはバグですか、それとも誰かが理由を説明できますか?
答えは「PHPだから」です。そして、PHPはそのタイプのステートメントについて保証しません(ちなみに、Cもそうしません)。
はい、それは間違っていると見なされる可能性がありますが、それはPHPです。この「バグではない」バグレポートを参照してください。
同様の例については、こちらをご覧ください。
基本的にこれは何が起こるかです:
最初++$i
に評価されます。$i
現在は2です。
$i += 2 + $i++ + ++$i;
次に、$i++
評価されます。$i
現在は3です。
$i += 2 + 2 + ++$i;
次に、++$i
評価されます。$i
現在は4です。
$i += 2 + 2 + 4;
最後に、合計が計算されます。
$i = 4 + 2 + 2 + 4 = 12
演算子の優先順位に関するドキュメントによると:
// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5
だから私は何が起こっているのか推測しています:
$i += ++$i + $i++ + ++$i;
に翻訳されます
$i = (++$i + $i++ + ++$i) + $i;
その場合、合計で12になります。
これらの増分の順序については保証されません。なぜあいまいなコードを書くのですか?
Java、JS、またはC ++は、この方程式をそのように評価します。
i = 1;
i += ++i + i++ + ++i; --> i = i* + ++i + i++ + ++i (i* is 1 all the time)
しかし、PHPでは:
$i = 1;
$i += ++$i + $i++ + ++$i; --> $i = $i* + ++$i + $i++ + ++$i ($i* is calculated after increments, in your situation $i* is 4)
違いは私が思うことです。