8

PHPマニュアルには、次のように記載されています。

$a = 1;
echo ++$a + $a++;

文法的にはあいまいですが、私には非常に明確に思えます。++$aと$a++は最初に左から右に評価されるため、++ $ aはインクリメントしてから2を返し、$a++は2を返してからインクリメントします。2 + 2の合計は4なので、4をエコーし​​ます。ただし、PHPマニュアルには、4または5が出力される可能性があると非常に明確に記載されています。

PHP仕様では、操作が左から右に実行されるように指定されていませんか?

操作が左から右に実行されることを強制しなくても、この場合、それは関係なく4を返しませんか?

編集:私はページを読み直しました、そしてそれはそれがそれぞれの特定のオペレーターによって決定されると述べました。+の優先順位が最も低く、左から右に評価されるため、以前の仮定は正しかったようです。私はまだ理解していません。

4

2 に答える 2

5

++$a2 にし$aて 2 を返し、 再び$a++インクリメントします。現在は 3 ですが、2 を返します。$a$a

同じ PHP バージョンでは、結果は常に同じです。ただし、PHP のバージョンが変わると、結果が異なる場合があります。どちらが最初に評価されるかは、++$aとに依存します。$a++が最初に評価された場合$a++、結果は 5 になり、それ以外の場合、結果は 4 になります。

于 2012-04-05T01:40:47.957 に答える
3

あくまで私の勝手な意見ですのでご了承ください。

この結果の背後にある考えは、演算子が 1 つしかない場合はどのオペランドにも優先順位がなく、演算では変数が最後の計算までのすべての計算でその結果に置き換えられるのではなく、参照として保持されるということです (さらに、この例では)。したがって、lr から移動する場合:

$a = 1;
++$a + $a++
operand 1 --> ++$a ==> $a = ++1 = 2
result (where $a = 2) --> 2 + (2++) = 4

それ以外の場合:

$a = 1;
++$a + $a++
operand 2 --> $a++ ==> $a = 1
// new operation on the left side
// so the value gets incremented ==> $a = 2
result (where $a = 2) --> (++2) + 2 = 5

しかし、これについてはよくわかりません。

于 2012-04-05T03:08:06.437 に答える