0

これはおそらくばかげた「問題」ですが、この動作の理由がわかりません。


事実:

$i++;

現在の値を返し、$i を 1 増やします。

++$i;

$i を 1 増やしてから $i を返します。


状況:

for($i = 0; $i < 10; ++$i){
    echo $i."\n";
}

与える

0
1
2
3
4
5
6
7
8
9

2番目:

for($i = 0; $i < 10; $i++){
    echo $i."\n";   
}

も与える

0
1
2
3
4
5
6
7
8
9

インクリメントのドキュメントをそのまま受け取るとしたら、次のようにループを説明します。

  1. 各反復の終わりに、$i は 1 ずつインクリメントされてから返されます。そのため、$i は 0 から始まったため、最初は 0 になり、次に 1 などになります。
  2. 各反復の終わりに、$i が返され、THEN がインクリメントされます。これは、正確には、$i = 0 の反復が 2 回あったことを意味します。


これが真実でないことは事実です。誰か説明してください、なぜですか?

4

5 に答える 5

6

$iは返品されておらず、 (あなたによって)使用されています。大きな違い。

代わりにループifを使用するようにステートメントを書き直すとしたら、次のようになります。while

ポストインクリメント:

$i = 0;

while ( $i < 10 ) {
    echo $i."\n";
    $i++;
}

事前増分:

$i = 0;

while ( $i < 10 ) {
    echo $i."\n";
    ++$i;
}

ご覧のとおり、両者に違いはありません。


for ループに指定する 3 つのステートメントは次のとおりです。

  1. 最初のステップの前に実行
  2. すべてのステップの前に実行します(戻り値を使用して、ループを続行するかどうかを決定します)
  3. すべてのステップのに実行

3 番目のステートメントの戻り値が何らかの方法で使用されることはありません。


PS前述のように、3番目のステートメントは、最後のステートメントを含むすべてのループの後に実行されます。これは、ループが完了した後に変数にアクセスすることで明らかです。$i

for ($i = 0; $i < 10; $i++) {
    echo $i."\n";
}
echo $i;

これは、 10までのすべての数字をリストします。

実際の動作はこちら: http://viper-7.com/Y6N2jU

于 2012-08-02T21:09:14.137 に答える
2

私が理解しているように、forループは3番目のパラメーターを実行する前に2番目のパラメーターの条件をチェックします。これは、どちらの場合も次のことを意味します。

  • $i値 0 で初期化されます (このステップは、後続の反復ごとに明らかにスキップされます)。
  • $i10 と比較されます (小さいです)。そして_
  • $i増加します。

最後のステップでは、 の値が$iインクリメントの前後に返されるかどうかは問題ではありません。これは、 の「返された」値が$i実際には比較で使用されないためです。メモリに格納されている asの実際の値は$i、比較が行われた後も、反復ごとに 1 ずつインクリメントされています。

于 2012-08-02T21:10:38.517 に答える
1

for ループには 3 つのコンポーネントがあります。

  1. 初期化コンポーネント (最初の「;」の前のコード)
  2. 終了条件 (最初の ';' と 2 番目の ';' の間のコード)
  3. インクリメント (2 番目の「;」の後)

これら 3 つのコードの実行順序は次のとおりです。

  • (1) forループの最初に1回だけ実行

  • (2)各反復の前に検証

  • (3)各繰り返しの後に実行

したがって、インクリメント操作の前置または後置の形式を使用するかどうかは重要ではありません。各反復の後、インクリメント (3) が実行され、インクリメントされた変数の新しい値が取得されます。

これ:

for($i = 0; $i < 10; $a = $i++){
    echo $i."\n";
}

これに比べて

for($i = 0; $i < 10; $a = ++$i){
    echo $i."\n";
}

各反復後に $a の値に違いが生じますが、 $i の値には違いがありません

于 2012-08-02T21:15:20.840 に答える
0

ループ内の 3 番目の式として変数をポストインクリメントまたはプリインクリメントしても、その動作には影響しません。

$i++++$iの両方がループの各反復の最後に実行されるためです。

于 2012-08-02T21:10:16.083 に答える
0

for ループ アウトを一連の if ステートメントとして記述すると、$i が毎回インクリメントされる理由がより理解できると思います。

i = 0
if i > 10
    return
else
    print i
    i++ // or ++i
if i > 10
    return
else
    print i
    i++ // or ++i

等々。

于 2012-08-02T21:11:39.110 に答える