1. 程式人生 > >C++筆記 第三十八課 邏輯操作符的陷阱---狄泰學院

C++筆記 第三十八課 邏輯操作符的陷阱---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux

第三十八課 邏輯操作符的陷阱

1.潛規則

邏輯運算子的原生語義
運算元只有兩種值(true和false)
邏輯表示式不用完全計算就能確定最終值—短路規則
最終結果只能是true或者false

38-1 邏輯表示式

#include <iostream>
#include <string>
using namespace std;
int func(int i)
{
    cout << "int func(int i) : i = " << i << endl;
    
    return i;
}
int main()
{
    if( func(0) && func(1) )
    {
        cout << "Result is true!" << endl;
    }
    else
    {
        cout << "Result is false!" << endl;
    }
    
    cout << endl;
    
    if( func(0) || func(1) )
    {
        cout << "Result is true!" << endl;
    }
    else
    {
        cout << "Result is false!" << endl;
    }
    
    return 0;
}

2.過載邏輯操作符

邏輯操作符可以過載嗎?過載邏輯操作符有什麼意義?

38-2 過載邏輯操作符

#include <iostream>
#include <string>
using namespace std;
class Test
{
    int mValue;
public:
    Test(int v)
    {
        mValue = v;
    }
    int value() const
    {
        return mValue;
    }
};
bool operator && (const Test& l, const Test& r)
{
    return l.value() && r.value();
}
bool operator || (const Test& l, const Test& r)
{
    return l.value() || r.value();
}
Test func(Test i)
{
    cout << "Test func(Test i) : i.value() = " << i.value() << endl;
    
    return i;
}
int main()
{
    Test t0(0);
    Test t1(1);
    
    if( func(t0) && func(t1) )
    {
        cout << "Result is true!" << endl;
    }
    else
    {
        cout << "Result is false!" << endl;
    }
    
    cout << endl;
    
    if( func(1) || func(0) )
    {
        cout << "Result is true!" << endl;
    }
    else
    {
        cout << "Result is false!" << endl;
    }
    
    return 0;
}

問題的本質分析
1.C++通過函式呼叫擴充套件操作符的功能
2.進入函式體前必須完成所有引數的計算
3.函式引數的計算次序是不定的
4.短路法則完全失效
邏輯操作符過載後無法完全實現原生的語義
一些有用的建議
實際工程開發中避免過載邏輯操作符
通過過載比較操作符代替邏輯操作符過載
直接使用成員函式代替邏輯操作符過載
使用全域性函式對邏輯操作符進行過載
小結
C++從語法上支援邏輯操作符過載
過載後的邏輯操作符不滿足短路原則
工程開發中不要過載邏輯操作符
通過過載比較操作符代替邏輯操作符過載
通過專用成員函式替換邏輯操作符過載