首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

三元運算符效率陷阱:重複求值導致副作用雙倍

     編輯:關於ASP.NET

條件運算子 ?: 基本語法

C# 唯一的三元運算子,語法:test ? expression1 : expression2。test 為 true 回傳 expression1,否則回傳 expression2。常作為 if-else 簡寫。

經典效能陷阱:條件與結果同為函式呼叫

$name = GET('name') != null ? GET('name') : '';

function GET($key) {
    if (isset($_GET[$key])) {
        $fp = fopen('c.txt','a');
        fwrite($fp, '1-'); // 記錄呼叫次數
        fclose($fp);
        return $_GET[$key];
    }
    return null;
}

執行後 c.txt 內容為 1-1-,證明 GET('name') 被呼叫了兩次:一次在條件判斷,一次在 true 分支回傳。

正確寫法:先存入變數

$name = GET('name');
$name = $name != null ? $name : '';

雖然多一行,但避免重複呼叫昂貴函式(如資料庫查詢、複雜運算、外部 API),效能提升顯著。

補充:運算子優先級提醒

三元運算子優先級低於指派運算子(=),故:

$a = $b ? $c : $d; // 正確:($a = ($b ? $c : $d))
$a = $b ? $c : $d = $e; // 錯誤解讀:($a = $b) ? $c : ($d = $e)

複雜表達式建議加括號明確優先順序,避免邏輯錯誤。

最佳實務總結

  1. 條件判斷與回傳值若涉及函式呼叫、屬性存取、副作用操作,務必先存入區域變數。
  2. 單純變數比較或常數則無妨直接內聯。
  3. 程式碼可讀性優先:超過一行或嵌套三元運算子時,改用 if-else 更清晰。

理解運算子求值順序與副作用,是寫出高效、無 Bug 程式碼的關鍵細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved