0

ここでは、修正後と前置演算子を使用する状況があります。以下のコード スニペットをご覧ください。演算子の優先順位が存在することは知っています。しかし、これについては明確な説明が必要です。

<?php
    $a=0;
    echo $a++ + ++$a; //this will result 2 that is ok

    $b=0;
    echo $b++ - ++$b; //this should result 0 isn't it? but am getting -2!
 ?>

更新:受け入れられた回答は、未定義の動作について説明しています

4

3 に答える 3

3

未定義の動作を利用すると、常に発生します。そして、あなたがしていることは未定義の動作です。したがって、未定義はその反対であるため、決定論的論理に従う説明を得ようとしないでください。

PHPマニュアルの状態:

// mixing ++ and + produces undefined behavior
$a = 1;
echo ++$a + $a++; // may print 4 or 5

コメントで質問を拡張しました:

echo $c=($b++) - (++$b);このステートメントの結果も -2 になります。未定義の動作とはどういう意味ですか?

$b = 0 and it shall:

$c=($b++) - (++$b);   | $b is 0  - process first brackets
$c= 0 - (++$b);       | $b is 1  - process second bracktes inner operator
$c= 0 - ($b);         | $b is 2  - process second brackets 
$c= 0 - 2;            | calculate
$c= -2;

これは明らかに、コードを実行したときの結果です。これが常にそのように計算されるとは定義されていないため、未定義です。たとえば、2 番目の括弧が最初に処理されると、異なる結果が得られます。

于 2012-05-03T10:51:25.543 に答える
2

インクリメント/デクリメント演算子が原因 (PHP doc)

<?php
    $a=0;
    echo $a++ + ++$a; // 0 + 2 = 2

    $b=0;
    echo $b++ - ++$b; // 0 - 2 = -2
 ?>

$a++戻り0、1 ずつインクリメント$aします ( $a == 1); 1 ( )++$aずつ増加して戻ります$a$a == 22

于 2012-05-03T10:54:04.837 に答える
2

結果はまったく問題ありません。

$a++ は値を出力し、すぐにインクリメントします ++$a は出力前にインクリメントします

したがって、最初のケースでは、これは次のようになります。

  1. $a=0
  2. 出力 0
  3. $a を 1 ずつ増やす: $a=1
  4. 再度インクリメント (出力前): $a=2
  5. 出力 2

0+2 = 2

2 番目のケースでは:

  1. $b=0
  2. 出力 0
  3. $b を 1 ずつ増やす: $b=1
  4. 再度インクリメント (出力前): $b=2
  5. 出力 2

0 - 2 = -2

それはただそれが言うことをします。

よろしく、

ステファン

于 2012-05-03T10:57:02.653 に答える