9

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 ずつ増やします。

4

3 に答える 3

5
a = 1;
++ (preincrement) gives a = 2 (higher precedence than +, and LR higher precedence than postincrement)
++ (postincrement) gives a = 3 (higher precedence than +)
+ (add) gives 2 + 3 = 5

$a は最初は 1 に設定されています。++$a は、式で使用する前に $a を事前にインクリメントし、2 に設定して、その値をレクサー スタックにプッシュします。次に $++ が実行されます。これは、インクリメンタが + よりも優先順位が高く、その値もその結果がレクサー スタックにプッシュされるためです。その後行われる加算は、レクサー スタックの 2 の結果をレクサー スタックの 3 の結果に加算し、5 の結果を与え、それがエコーされます。行が実行された後の $a の値は 3 です。

また

a = 1;
++ (preincrement) gives a = 2 (higher precedence than +, and LR higher precedence than postincrement)
+ (add) gives 2 + 2 = 4 (the value that is echoed)
++ (postincrement) gives a = 3 (incremented __after__ the variable is echoed)

$a は最初は 1 に設定されています。数式が解析されると、++$a は $a を事前にインクリメントし、数式で使用する前に 2 に設定します (結果をレクサー スタックにプッシュします)。次に、レクサースタックからの結果と $a の現在の値が加算されて 4 になります。この値がエコーされます。最後に、$a はポストインクリメントされ、$a に 3 の値が残ります。

于 2013-01-02T07:26:14.330 に答える
1

はい、右側の演算子が優先度/優先度によって最初に機能し、その後 sum(+) 演算子が機能するため、5 が返されます。したがって、最初のインクリメントは2になり、2番目のインクリメントは3になり、その後、両方が合計され、結果が5として出力されます

$result = ++$a + $a++;

++$a2として出力

$a++出力は 2 3 のみですが、内部的にインクリメントされます。

最終的に合計は 2+3 = 5 として発生します

于 2013-01-02T07:29:39.080 に答える
0

マーク、あなたは間違っていると思います!

後置インクリメント: $a を返し、$a を 1 ずつ増やします。(資料より)

そのため、合計演算で $a 値 3 を取得する方法はありません。

于 2013-01-02T08:49:33.390 に答える