萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 遞增/遞減運算子 ($a++ vs ++$a) 深度解析:前綴與後綴、副作用、布爾/字串特殊行為

核心差異:前綴 vs 後綴

運算子名稱回傳值副作用 (變數值變化)
++$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 循環進位,非字母數字字元不遞增。

NULL/未定義變數

<?php
$unsetVar++;
echo $unsetVar; // 1 (NULL → 0 → 1,並發出 E_NOTICE)

$nullVar = null;
$nullVar++;
echo $nullVar; // 1
?>

實務最佳實踐

  1. 獨立陳述式使用:$i++; 或 ++$i; 獨立一行,效果相同,前綴微快 (無需暫存舊值),但現代引擎優化後差異可忽略。
  2. for 迴圈慣用前綴:for (++$i; ...) 風格統一,語意「先遞增再判斷」 (雖 for 迴圈第三部分執行時機固定)。
  3. 避免在複合表達式中使用:func($i++, ++$i) 極難閱讀且依賴求值順序。
  4. 字串遞增僅用於特定場景:如產生序列 ID (A, B, ... Z, AA, AB...),勿用於一般計數。

結語

++$a 回傳新值,$a++ 回傳舊值,兩者皆將變數加 1。獨立語句下效果相同,複合表達式中行為極易誤解。布爾值不遞增,字串遞增遵循字母數字進位規則。現代 PHP 開發:迴圈計數用獨立 ++$i,其他場合優先考慮可讀性 (如 $i += 1)。

copyright © 萬盛學電腦網 all rights reserved