PHP マニュアルのoperator precedence sectionに、次の例があります。
// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5
次の理由により、動作が未定義であることを理解しています。
x + y = y + x
インタプリタは、速度やメモリを最適化するために、任意の順序で自由に評価および追加できるためですx
。この記事の C コードの例y
を見て、これを結論付けました。
4
私の質問は、式と部分式がどのように評価されても、上記の PHP コードの出力は次のようになるべきだということです。
- op1 = ++$a => $a = 2, op1 = 2; op2 = $a++ => op2 = 2, $a = 3; 2 + 2 = 4
- op1 = $a++ => op1 = 1, $a = 2; op2 = ++$a => op2 = 3, $a = 3; 1 + 3 = 4
5はどこから?または、オペレーターの仕組みについてもっと学ぶ必要がありますか?
編集:
Incrementing/Decrementing Operatorsセクションを見つめてきましたが、なぜ 5.
++$a: プリインクリメント -- $a を 1 インクリメントしてから、 $aを返します。
$a++: Post-increment -- $a を返し、$ a を 1 ずつ増やします。