38_論理オペレータのトラップ

2982 ワード

1.論理オペレータの本来の意味
  • オペランドは2つの値(trueとfalse)
  • のみである.
  • 論理式は完全に計算することなく最終値を決定することができる--短絡原則
  • 最終結果はtrueまたは**false**プログラミングのみ:論理式
  • #include 
    #include 
    
    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 << "Resutl is ture!" << endl;
        }
        else
        {
            cout << "Result is false!" << endl;
        }
        
        cout << endl;
        
        if( func(0) || func(1) )
        {
            cout << "Resutl is ture!" << endl;
        }
        else
        {
            cout << "Result is false!" << endl;
        }
    
        return 0;
    }
    

    出力結果:
    int func(int i): i = 0
    Result is false!
    
    int func(int i): i = 0
    int func(int i): i = 1
    Resutl is ture!
    

    2.論理オペレータのリロード
    質問:論理オペレータは再ロードできますか?論理オペレータの再ロードには何の意味がありますか?
    #include 
    #include 
    
    using namespace std;
    
    class Test
    {
        int mValue;
    public:
        Test(int value)
        {
            mValue = value;
        }
        int value() const 
        {
            return mValue;
        }
    };
    
    Test func(Test i)
    {
        cout << "Test func(Test i) : i.value() = " << i.value() << endl;
    
        return i;
    }
    
    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();
    }
    
    int main()
    {
        Test t0(0);
        Test t1(1);
    
        if( func(t0.value()) && func(t1.value()) )
        {
            cout << "Resutl is ture!" << endl;
        }
        else
        {
            cout << "Result is false!" << endl;
        }
        
        cout << endl;
        
        if( func(t1) || func(t0) )
        {
            cout << "Resutl is ture!" << endl;
        }
        else
        {
            cout << "Result is false!" << endl;
        }
    
        return 0;
    }
    

    出力結果:
    Test func(Test i) : i.value() = 1
    Test func(Test i) : i.value() = 0
    Result is false!
    
    Test func(Test i) : i.value() = 0
    Test func(Test i) : i.value() = 1
    Resutl is ture!
    

    観察の結果,短絡法則は満たされていないことが分かった.
  • 問題の本質分析
  • C++関数呼び出し拡張オペレータの機能
  • 関数体に入る前にすべてのパラメータの計算を完了しなければならない
  • 関数パラメータの計算順序式不定の
  • 短絡法則完全失効

  • 論理オペレータを再ロードすると、元の意味を完全に実現できません.オペレータのリロードはオペレータの元の意味を変えることはできませんが、論理オペレータのリロードは論理オペレータの短絡法則を実現することはできません.そのため、論理オペレータのリロードは最も不要です.
    3.役に立つアドバイス
  • 実際のエンジニアリング開発では、論理オペレータ
  • の再ロードを回避
  • 論理オペレータの代わりにリロード比較オペレータにより
  • をリロードする.
  • 論理オペレータの代わりにメンバー関数を直接使用して
  • を再ロード
  • グローバル関数を使用して論理オペレータをリロード
  • 4.まとめ
  • C++論理オペレータリロード
  • を構文的にサポート
  • リロード後の論理オペレータは短絡法則
  • を満たさない.
  • エンジニアリング開発では論理オペレータ
  • を再ロードしない
  • 論理オペレータをリロード比較オペレータにより置換リロード
  • .
  • 論理オペレータを専用メンバー関数に置換して
  • を再ロードする.