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

PHP 運算子詳解:&& 邏輯與 vs & 位元和 的差異與應用場景

     編輯:PHP 相關知識

前言

PHP 中 && 與 & 僅差一字元,卻代表完全不同的運算邏輯。混淆兩者是新手常見 Bug 來源。本文將從定義、真值表、實例、應用場景四個維度徹底釐清差異。

1. && —— 邏輯與

定義

屬於邏輯運算子,僅處理布林值(true/false)。兩邊運算元皆為 true 時才回傳 true,否則 false。具備短路特性:左邊為 false 時,右邊不再執行。

真值表

ABA && B
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

常見邏輯運算子對照

  • !$a:邏輯非
  • $a && $b:邏輯與
  • $a || $b:邏輯或

實戰範例

$isLogin = true;
$hasPerm = false;

if ($isLogin && $hasPerm) {
    echo '允許存取';
} else {
    echo '權限不足';
}
// 輸出:權限不足(短路:$hasPerm 為 false,後續不執行)

2. & —— 位元 AND

定義

屬於位元運算子,對整數的二進位制逐位運算:對應位皆為 1 時結果位為 1,否則 0。不具短路特性,兩邊皆會完整運算。

運算示意

5  = 0b0101
3  = 0b0011
5 & 3 = 0b0001 = 1

實戰範例:權限位元遮罩

const READ   = 1; // 0b0001
const WRITE  = 2; // 0b0010
const EXEC   = 4; // 0b0100
const ADMIN  = 8; // 0b1000

$userPerm = READ | WRITE; // 0b0011 = 3

// 檢查是否有 READ 權限
if ($userPerm & READ) {
    echo '可讀取'; // true
}

// 檢查是否同時擁有 READ 和 WRITE
if (($userPerm & (READ | WRITE)) === (READ | WRITE)) {
    echo '可讀寫'; // true
}

3. 核心差異速查表

特性&& (邏輯與)& (位元和)
運算對象布林值整數(位元)
回傳型別boolint
短路求值是否
典型用途條件判斷、流程控制權限遮罩、旗標運算、底層優化
優先級低高(高於 ==、||)

4. 易錯陷阱與最佳實務

陷阱 1:優先級導致非預期結果

$a = 5; $b = 3;
$result = $a & $b == 1; // 解析為 $a & ($b == 1) → 5 & true → 1 (true)
// 建議加括號
$result = ($a & $b) == 1; // 正確

陷阱 2:誤用 & 進行邏輯判斷

function foo() { echo 'foo'; return false; }
function bar() { echo 'bar'; return true; }

if (foo() & bar()) { } // 輸出 foo bar(兩邊都執行,無短路)
if (foo() && bar()) { } // 輸出 foo(短路,bar 不執行)

最佳實務

  • 條件判斷永遠用 &&、||:語意清晰、效能更好(短路)。
  • 位元旗標、權限遮罩、底層運算用 &、|、^、~。
  • 明確括號:混用時務必加括號消除歧義。
  • 型別轉換注意:&& 會將運算元轉布林;& 會將運算元轉整數("5" & 3 = 1)。

總結

&& 是給邏輯判斷用的,& 是給位元運算用的。記住:「雙符號做邏輯,單符號做位元」,並在條件判斷中善用短路特性提升效能與避免副作用。

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