5

次のコード スニペットを参照してください。

$i=1;

echo $i.($i++);

すぐに、結果は になると思いました12が、実際の結果は21です。

また

echo $i,$i++;

だろうと思ったが12、その11

echo ($i = ($i++)); //result is 1

echo ($i = ($i+1)); //result is 2

しかし、なぜ?

4

4 に答える 4

4

変数が算術演算に関与していない場合 (最初の のように$i)、PHP は一時変数を作成しません。したがって、最初のステートメントは、すでに実行されている$iステートメントの最後に評価されます。$i++

これを防ぐために、次のように書くこともできます:

echo ($i += 0).($i++);

しかし、これは明らかに良いコーディング方法ではありません。

編集:使用,すると、実際には2つのPHPステートメントを短縮するための構文糖衣です。以下と厳密に同等です。

echo $i;
echo $i++;

インクリメントは最後のステートメントの後に実行されるため、11確かに結果です。

于 2013-10-05T15:45:52.930 に答える
1

次の場所に記載されている PHP ドキュメントに従って: Operator Precedence

最初のケース

$i=1;

echo $i.($i++);

$iは値 1 に初期化されます。現在は、++より高い優先順位に従い、.右結合を持ちます。これは、あなた$i++が最初に評価されることを意味します。この場合、 の値は$i++になり1、 の次の値は$iにインクリメントされ2ます。したがって$i、2

.の後に次の優先順位があり、左++結合です。したがって、左から始まる値を評価します。

だから$i=2 そして$i++ =1、したがって出力 21

2 番目のケース

$i=1;

echo $i,$i++;

ここでは、オペレータは 1 つだけ++です。したがって、優先順位を比較する必要はありません。したがって、左結合のデフォルト標準によって評価されます。$i = 1$i++ = 1。したがって11

3番目のケース

echo ($i = ($i++)); //result is 1

この場合、 now=は代入演算子であり、右結合なので$i++ = 1. また、代入演算子であるため、 の値$i++が に格納され$iます。したがって echo ($i = 1);、出力は になり1ます。

4番目のケース

echo ($i = ($i+1)); //result is 2

繰り返しますが、これは右結合なので、$i+1 = 2. したがって echo ($i = 2);、出力は になり2ます。

于 2013-10-05T16:19:35.717 に答える
0

まず、2 番目に $i eq 1 を使用します。次に、それを 2 に増やします。したがって、最初の場所では 2 を使用し、2 番目の場所では - 1 を使用します

于 2013-10-05T15:40:28.267 に答える