--$i返回减1后的值,$i--返回减1前的值;赋值时$i = $i--因先取旧值再减、最后又覆写旧值,导致变量值不变,而--$i和$i -= 1则确定递减。

PHP中--$i和$i--的返回值差异
区别不在“最终变量是否减了1”,而在于表达式求值时返回的是哪个值:--$i返回减1后的值,$i--返回减1前的值。这个差异在赋值、函数调用、数组索引等场景中会直接暴露出来。
例如:
$i = 5; $a = --$i; // $i 先变4,$a 得到 4 $b = $i--; // $b 得到 4,然后 $i 变成 3
结果是:$a === 4,$b === 4,但最终$i === 3——两次都减了1,但$b拿到的是中间态的值。
为什么$i = $i--不等于$i--或$i -= 1
这是最常踩的坑:后置递减在赋值语句中会先取旧值,再执行减操作,但赋值目标又把旧值写回变量,导致“看似减了,实际没变”。
-
$i = 5; $i = $i--;→ 等价于:$temp = $i; $i = $i - 1; $i = $temp;,最终$i还是5 -
$i = 5; $i--;→$i变成4(无赋值覆盖) -
$i = 5; $i -= 1;→$i变成4,行为确定、无歧义
这种写法在PHP中不会报错,但逻辑完全失控,尤其在循环条件或状态判断里容易引发静默bug。
在数组索引和循环中误用$i--的越界风险
当$i--出现在下标位置(比如$arr[$i--]),PHP先用当前$i取值,再减1。如果此时$i已是0,取$arr[0]没问题,但随后$i变成-1——后续若继续用它做边界判断(如while ($i >= 0)),可能跳过最后一次迭代,或触发负索引警告(取决于错误级别)。
更危险的是嵌套使用:
$i = 1; echo $arr[$i--] . $arr[$i--]; // 先取$arr[1],再取$arr[0],但$i最终为-1
若$arr只有两个元素(索引0和1),这没问题;但若逻辑依赖$i作为“剩余计数”,-1就不再是合法计数器了。
性能与可读性:为什么推荐优先用--$i
对整型变量,性能差异微乎其微;但对对象(如自定义计数器类)或在高频循环中,$i--需创建临时副本保存旧值,而--$i直接返回引用或新值,避免一次拷贝。
更重要的是语义清晰:
-
for ($i = $len; $i > 0; --$i) { ... }:意图明确——每次迭代前减,条件检查的是新值 -
for ($i = $len; $i > 0; $i--) { ... }:减发生在循环体结束后,条件检查的是旧值,易与while逻辑混淆
真正容易被忽略的点是:PHP的foreach不涉及手动索引,但凡需要反向遍历数组且依赖索引运算,--$i比$i--更贴近“先更新、再使用”的直觉,也更少引发边界错位。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











