##結論
インクリメントされるタイミングが異なる。
##説明
演算子 | 名称 | 返り値 |
---|---|---|
$var++ | 後置インクリメント | $var |
++$var | 前置インクリメント | $var + 1 |
$var-- | 後置デクリメント | $var |
--$var | 前置デクリメント | $var - 1 |
参考:プログラミングPHP(O'REILLY)
- 後置インクリメント(デクリメント)は、インクリメント(デクリメント)する前に元の値を返す。
- 前置インクリメント(デクリメント)は、インクリメント(デクリメント)した後で新しい値を返す。
文字よりコードを見た方が分かりやすいです。
###後置インクリメント
<?php
$var = 1;
echo '$var++は、' . $var++; #インクリメントする前に元の$var = 1を返す
echo '$varは、' . $var; #インクリメントした後の新しい値を返す
#$var++は、1
#$varは、2
###前置インクリメント
<?php
$var = 1;
echo '++$varは、' . ++$var; #インクリメントした後の$var = 2を返す
echo '$varは、' . $var; #既にインクリメントされているので$var = 2
#++$varは、2
#$varは、2
###ベンチマーク
PHP 5.5.6
前置インクリメント(デクリメント)の方が最大3.8%ほど速かったが、誤差の範囲内ではなかろうか。
(++$iを2回行っているのは、初めの++$iが何故かかなり遅くなるため)
<?php
require_once('Benchmark/Timer.php');
function before_inc($num) {
for($i = 0; $i < $num; ++$i) {
}
}
function after_inc($num) {
for($i = 0; $i < $num; $i++) {
}
}
function before_dec($num) {
for($i = $num; $i > 0; --$i) {
}
}
function after_dec($num) {
for($i = $num; $i > 0; $i--) {
}
}
$num = 10000;
echo $num . "\n";
$timer = new Benchmark_Timer();
$timer->start();
before_inc($num);
$timer->setMarker('++$i_1');
before_inc($num);
$timer->setMarker('++$i_2');
after_inc($num);
$timer->setMarker('$i++');
before_dec($num);
$timer->setMarker('--$i');
after_dec($num);
$timer->setMarker('$i--');
$timer->stop();
$timer->display();
##参考
プログラミングPHP 第2版