在 C++ 中,邏輯運算子(Logical Operators) 主要用來處理條件判斷,邏輯運算在執行時會伴隨隱性轉型與短路求值(Short-circuit Evaluation),若不了解其運作方式,容易在條件判斷中產生非預期結果。看似簡單,但其實藏了不少容易忽略或常忘的細節。
一、bool與隱性轉型(Implicit Conversion)
在 C++ 中,bool 可以自動轉換成整數型別:
true -> 1
false -> 0
因此以下程式碼是合法的:
int a = true + true; // a = 2
int b = false + 5; // b = 5
這種轉換稱為隱性轉型,由編譯器根據「運算子與型別」自動決定。
📌 注意:
◆bool → int是允許的
◆反過來int → bool則是0為false,非0為true
二、邏輯運算子(Logical Operators)
C++ 提供三種基本邏輯運算子:
&& // AND
|| // OR
! // NOT
使用範例:
int a = 0;
int b = 1;
if(a == 0 && b == 1)
{
cout << "true" << endl;//print "true"
}
if(a == 0 || b == 0)
{
cout << "true";//print "true"
}
! 只需要一個運算元,用來反轉布林結果:
!(3 > 2) // false
等同於
not (3 > 2)
int a = 0;
int b = 1;
if(!(a > b))
{
cout << "A";//print A
}
C++ 也提供對應的保留字:and/or/not關鍵字
if (a > 0 and b > 0) {}
符號 關鍵字
&& | and
|| | or
! | not
📌實務上大多仍使用符號版本,閱讀他人程式碼時需能辨識。
三、運算只會一次做一件事
C++ 不會同時執行多個運算,而是依序進行。
實際執行順序由以下因素決定:
-運算子優先順序
-運算子結合性(Associativity)
-隱性轉型規則
賦值運算子的順序
賦值運算子是由右向左開始,進行連續賦值。
a = b = c = 9;
等同於
c = 9;
b = c;
a = b;
const:讓物件成為唯讀
const用來表示「初始化後不可再被修改」。
const int x = 10;
x = 20; // 編譯錯誤
使用 const 的好處:
◆避免誤修改
◆提高程式可讀性
◆讓編譯器進行更多檢查與最佳化
複合賦值運算子
複合賦值只是語法的簡化,但仍是正式運算。
a += 5; // a = a + 5
a -= 3;
a *= 2;
a /= 4;
遞增與遞減運算子
a++與++a 的差異
int a = 5;
int x = a++; // x = 5, a = 6
int y = ++a; // a = 7, y = 7
📌差異在於:
a++:先使用,再遞增
++a:先遞增,再使用
未定義行為(Undefined Behavior)
以下程式碼是錯誤示範:
a = a++;
同一個運算式中,同一變數同時被讀取與修改。
結果行為完全不可預期,請務必避免。
如果你也是非本科背景,或正準備開始學習程式,希望這篇筆記能對你有所幫助。
這裡會持續記錄我在轉職過程中對程式、軟體工程與實務學習的理解,歡迎一起交流,也歡迎指教。
如果這篇內容對你有幫助,歡迎收藏或分享給正在學習程式的朋友。