2012-02-18 12 views
2

インクリメント演算子に奇妙な問題が発生しました。下のコードはどのように出力する必要がありますか?

$j = 0; 
for ($i=0; $i<100; $i++) 
{ 
    $j = $j++; 
} 
echo $j; 

エコー0.なぜ100ですか?


編集:私は$j = ++$jから$j = $j++を変更すると、それは、100

+2

あなたはpostfix増分を使用しています。これは増分する前に変数の値を割り当てます。だから毎回 '$ j' = 0です。 '++ $ j'は代入の前にインクリメントを行います。もちろん、譲渡を一切スキップして、それだけで '$ j ++'を行うことができます... – Interrobang

+0

これは良い面接の質問でしょう。 – Umbrella

+0

@ Umbrella:サイト上の候補者を招待する価値があるかどうかを判断するのに役立つ電話スクリーンの質問です。 –

答えて

7

変更後の変数の後に++が表示されるため、「ポストインクリメント」が実行されています。あなたが++$jを持っていた場合には、jは最初の増分なり、そして得られたインクリメント値が戻っJ.に割り当てられることになるが、このような構造を作る

for ($i = 0; $i < 100; $i++) { 
    $temp = $j; // store j 
    $j = $j + 1; // $j++ 
    $j = $temp; // pull original j out of storage 
} 

:少ないコンパクトな形で書かれたコードは、つまるところほとんど意味がない。あなたは、単に

for (...) { 
    $j = $j + 1; 
} 
+0

ありがとうMarc B、あなたは私の混乱を解決し、$ j ++の値を最初に格納するので、最終的に0に変わります。 ++ $ jを使用すると、最初に値が追加されます! – steve

6

問題はライン、そして$j 1にインクリメント$j 0としてこのコマンドは評価

$j = $j++; 

であるエコー最後に0を$jに割り当てます。

$j = $j + 1;またはちょうど$j++;を使用してください。

+1

か、単に '$ j = ++ $ j;' –

+3

@AaronWを実行してください。それはうまくいくが、冗長で混乱する。私のチームはコードレビューを許可しません。 –

3

$j++に沸く

for (...) { 
    $j++; 
} 

を書き出すことができますポストインクリメントである:式の値が、その後$jがインクリメントされ、$jです。したがって、jの値を取得してからjをインクリメントし、jをjの元の値に設定します。

関連する問題