41209


ドキュメントを見たところ

[code]

    <?php
    $var = 0;
    echo ++$var;//1
    
[/code]

インクリメントが前にあるときは値が加算されたものを返すのはわかりました。

ただfor文をためしてみると疑問がおこりました。

[code]

    $a = array("sugimoto", "taguti", "fkoji")
    for($i = 0; $i < count($a); ++$i){
        echo $a[$i], PHP_EOL;
    }
    //sugimoto taguti fkoji
    
[/code]

前インクリメントだと先にプラスになるから  
//taguti fkoji  
になりそうなものですが、この挙動はいったいなんなのでしょうか？  
もしよろしければご教授願います。


CC BY-SA 3.0
2018-01-25T10:08:50.343
41205
2018-01-25T10:51:38.990
26076
question
php
phpのfor文についてインクリメントが ++$i と $i++の時の結果が同じになるのはなぜでしょうか？


セミコロンで区切られた各式、`$i = 0` と `$i < count($a)` と `++$i` はそれぞれ独立しています。

下記のように考えてみてください。

[code]

    $i = 0;
    while ($i < count($a)) {
        echo $a[$i], PHP_EOL;
        ++$i;
    }
    
[/code]

独立した文なので、最後のインクリメントが`++$i`か`$i++`かは、他の行の実行結果に影響しません。


CC BY-SA 3.0
2018-01-25T10:43:53.357
41208
2018-01-25T10:43:53.357
3337
41205
answer


「前インクリメントだと先にプラス」という動作の意味を誤解されているようです。前置インクリメントと後置インクリメントの違いは、「式としての値」を取得するのと「変数の内容をインクリメントする」ことの間での後・先になります。つまり、「式としての値」を使わない場所では、前置でも後置でも全く同じ動作になります。

phpに限らずC言語スタイルの`for`文:

[code]

    for( 初期化; 判定; 更新 ) {
        ループの中身
    }
    
[/code]

という文は厳密に次のようなコードと同じ順序で評価されます。

[code]

    初期化;
    while( 判定 ) {
        ループの中身
        更新;
    }
    
[/code]

「更新」の中身に、前置インクリメントがあるからと言って、この順序が変更されることはありません。

また「判定」のところに記述した式は、その値が使われてループを続行するのかどうかの判定に使われますが、「初期化」「更新」に書いた式の値は使われません。(例えば`$i
= 0`という式の値は`0`になるのですが、その`0`という値は使われません。)

従って、式の値が使われない場所に書いてある前置インクリメントと後置インクリメントの動作には全く違いが見られないということになります。

* * *

逆に「判定」のところに書いた式は、その式の値が使われますから、結果に差が出てきます。インクリメントではなくデクリメントですが、次のような`for`文の動作を確かめてみられると良いでしょう。

[code]

    for( $i = 10; --$i; ) {
        echo $i;
    }
    
    for( $i = 10; $i--; ) {
        echo $i;
    }
    
[/code]


CC BY-SA 3.0
2018-01-25T10:51:38.990
41209
2018-01-25T10:51:38.990
13972
41205
answer