38_論理オペレータのトラップ
2982 ワード
1.論理オペレータの本来の意味オペランドは2つの値(trueとfalse) のみである.論理式は完全に計算することなく最終値を決定することができる--短絡原則 最終結果はtrueまたは**false**プログラミングのみ:論理式
出力結果:
2.論理オペレータのリロード
質問:論理オペレータは再ロードできますか?論理オペレータの再ロードには何の意味がありますか?
出力結果:
観察の結果,短絡法則は満たされていないことが分かった.問題の本質分析 C++関数呼び出し拡張オペレータの機能 関数体に入る前にすべてのパラメータの計算を完了しなければならない 関数パラメータの計算順序式不定の 短絡法則完全失効
論理オペレータを再ロードすると、元の意味を完全に実現できません.オペレータのリロードはオペレータの元の意味を変えることはできませんが、論理オペレータのリロードは論理オペレータの短絡法則を実現することはできません.そのため、論理オペレータのリロードは最も不要です.
3.役に立つアドバイス実際のエンジニアリング開発では、論理オペレータ の再ロードを回避論理オペレータの代わりにリロード比較オペレータにより をリロードする.論理オペレータの代わりにメンバー関数を直接使用して を再ロードグローバル関数を使用して論理オペレータをリロード 4.まとめ C++論理オペレータリロード を構文的にサポートリロード後の論理オペレータは短絡法則 を満たさない.エンジニアリング開発では論理オペレータ を再ロードしない論理オペレータをリロード比較オペレータにより置換リロード .論理オペレータを専用メンバー関数に置換して を再ロードする.
#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!
観察の結果,短絡法則は満たされていないことが分かった.
論理オペレータを再ロードすると、元の意味を完全に実現できません.オペレータのリロードはオペレータの元の意味を変えることはできませんが、論理オペレータのリロードは論理オペレータの短絡法則を実現することはできません.そのため、論理オペレータのリロードは最も不要です.
3.役に立つアドバイス