邏輯操作符的原生語義:運算元只有兩種值(true和false),邏輯表示式不用完全計算就能確定最終值,最終結果只能是true或者false。
邏輯操作符可以過載嗎?
#include
#include
using namespace std;
int func(int i)
int main()
else
cout << endl;
if( func(0) || func(1) )
else
return 0;
可以過載邏輯操作符,陷阱:
#include
#include
using namespace std;
class test
int value() const
};bool operator && (const test& l, const test& r)
bool operator || (const test& l, const test& r)
test func(test i)
int main()
else
cout << endl;
if( func(1) || func(0) ) // operatpr || ( func(t0), func(t1))
else
return 0;
問題的本質分析:
進入函式體之前,兩個引數值必須確定。不管引數是什麼,func要呼叫兩次。求值順序是不確定的。c++通過函式呼叫擴充套件操作符的功能。進入函式體之前必須完成所有引數的計算。函式引數的計算是不確定的,短路法則完全失效。
邏輯操作符過載後無法實現原生的語義。建議:
實際工程開發中避免過載邏輯操作符,通過過載比較操作符代替邏輯操作符過載,直接使用成員函式代替邏輯操作發過載,使用全域性函式對邏輯操作符進行過載。
第38課 邏輯操作符的陷阱
1.1 運算元只有兩種值 true和false 1.2 邏輯表示式不用完全計算就能確定最終值 1.3 最終結果只能是true或false 邏輯表示式 又叫短路表示式 include using namespace std int func int i int main else cout endl ...
C 38 邏輯操作符的陷阱
include include using namespace std int func int i int main else cout endl if func 1 func 0 else return 0 輸出 短路法則 int func int i 0 result is false int...
邏輯操作符的陷阱
運算元只有兩種值 true和false 邏輯表示式不用完全計算就能確定最終值 最終結果只能是true或者false 那麼,如果我們過載邏輯運算子會發生什麼?例 1 include 2 include 3using namespace std 4class test 512 test 1315 int...