| 運算子 | 名稱 | 回傳值 | 副作用 (變數值變化) |
|---|---|---|---|
++$a | 前綴遞增 | 遞增後的值 | $a = $a + 1 |
$a++ | 後綴遞增 | 遞增前的值 | $a = $a + 1 |
--$a | 前綴遞減 | 遞減後的值 | $a = $a - 1 |
$a-- | 後綴遞減 | 遞減前的值 | $a = $a - 1 |
<?php
$a = 10;
echo $a++; // 10 (回傳舊值)
echo $a; // 11 (變數已變)
$b = 10;
echo ++$b; // 11 (回傳新值)
echo $b; // 11
?>
<?php
$a = 10;
$b = $a++ + ++$a; // ⚠️ 未定義行為! 不要這樣寫
// PHP 7.0+ 定義了求值順序:左運算元先求值
// 但「同一表達式中多次修改同一變數」屬於未定義行為,不同版本/引擎結果可能不同
// 實測 PHP 8.2: $a=10; $b = $a++ + ++$a; → $b=22, $a=12
// 過程:左 $a++ 取 10 ($a→11),右 ++$a 取 12 ($a→12),10+12=22
// 鐵律:同一表達式中,變數至多修改一次
$c = 10;
$d = $c++; // 明確分步
$e = ++$c;
?>
<?php
$a = true;
echo $a++; // 1 (true 轉整數 1,但布爾值不參與遞增,值不變)
echo $a; // 1 (仍為 true)
$b = false;
echo $b++; // 0
echo $b; // 0 (仍為 false)
// 結論:布爾值 ++/-- 無效果,參與算術運算時轉為 0/1
echo $a + 1; // 2 (true → 1 + 1)
?>
<?php
$c = 'a';
echo $c++; // a
echo $c; // b
$d = 'z';
echo $d++; // z
echo $d; // aa (進位)
$e = 'Z';
echo $e++; // Z
echo $e; // AA
$f = 'a9';
echo $f++; // a9
echo $f; // b0 (字母進位,數字歸零)
$g = '99';
echo $g++; // 99
echo $g; // 100 (純數字字串視為數字進位)
?>
遵循 Perl 風格字元遞增規則:a-z, A-Z, 0-9 循環進位,非字母數字字元不遞增。
<?php
$unsetVar++;
echo $unsetVar; // 1 (NULL → 0 → 1,並發出 E_NOTICE)
$nullVar = null;
$nullVar++;
echo $nullVar; // 1
?>
$i++; 或 ++$i; 獨立一行,效果相同,前綴微快 (無需暫存舊值),但現代引擎優化後差異可忽略。for (++$i; ...) 風格統一,語意「先遞增再判斷」 (雖 for 迴圈第三部分執行時機固定)。func($i++, ++$i) 極難閱讀且依賴求值順序。++$a 回傳新值,$a++ 回傳舊值,兩者皆將變數加 1。獨立語句下效果相同,複合表達式中行為極易誤解。布爾值不遞增,字串遞增遵循字母數字進位規則。現代 PHP 開發:迴圈計數用獨立 ++$i,其他場合優先考慮可讀性 (如 $i += 1)。