38 邏輯操作符的陷阱

2021-08-19 19:18:56 字數 973 閱讀 5431

邏輯操作符的原生語義:運算元只有兩種值(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...