次のコード スニペットを参照してください。
$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 を使用します