次のコード スニペットを参照してください。
$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
しかし、なぜ?
次のコード スニペットを参照してください。
$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
しかし、なぜ?
変数が算術演算に関与していない場合 (最初の のように$i)、PHP は一時変数を作成しません。したがって、最初のステートメントは、すでに実行されている$iステートメントの最後に評価されます。$i++
これを防ぐために、次のように書くこともできます:
echo ($i += 0).($i++);
しかし、これは明らかに良いコーディング方法ではありません。
編集:使用,すると、実際には2つのPHPステートメントを短縮するための構文糖衣です。以下と厳密に同等です。
echo $i;
echo $i++;
インクリメントは最後のステートメントの後に実行されるため、11確かに結果です。
次の場所に記載されている 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ます。
まず、2 番目に $i eq 1 を使用します。次に、それを 2 に増やします。したがって、最初の場所では 2 を使用し、2 番目の場所では - 1 を使用します