第38課 邏輯操作符的陷阱

2021-08-14 17:31:51 字數 1994 閱讀 5487

1.1、

運算元只有兩種值(true和false)

1.2、

邏輯表示式不用完全計算就能確定最終值

1.3、

最終結果只能是true或false

/***************      邏輯表示式(又叫短路表示式)     *************/

#include

using namespace std;

int func(int i)

int main()

else

cout << endl;

//||的短路:只要乙個為1,就短路

if(func(0) || func(1))

else

return 0; }

2.1、

過載出現的問題及分析

(過載任意操作符都不能改變他的原生語義)

2.1.1、c++通過

函式呼叫擴充套件操作符的功能

2.1.2、進入函式體前

必須完成所有引數的計算

2.1.3、函式引數的計算次序是

不定

2.1.4、短路法則完全失效

2.2、邏輯操作符過載後

無法完全實現原生的意義

2.3、一些有用的建議

2.3.1、實際工程開發中

避免過載邏輯操作符

2.3.2、通過過載

比較操作符代替邏輯操作符過載

2.3.3、直接使用

成員函式代替邏輯操作符過載

2.3.4、使用

全域性函式對邏輯操作符進行過載

為什麼不要 過載邏輯與和邏輯或&& || 操作符(

/***************      操作邏輯運算子     *************/

#include

using namespace std;

class test

int value() const   //const修飾的函式,const物件才能呼叫,呼叫const成員,變數

};//利用全域性函式過載&&操作符

bool operator && (const test& lp, const test& rp)

//利用全域性函式過載||操作符

bool operator || (const test& lp, const test& rp)

//經過測試::普通物件也能呼叫const物件。

test func(test i)//這個函式的作用就是列印一下物件的值,返回的‎還是類的物件

int main()

else

cout << endl;

//相當於函式呼叫,進入函式體,引數的值必須被計算出來,兩個引數計算出來,才能進入operator函式體。

//短路法則完全失效,過載改變了||原來短路的語義。

if(func(t1) || func(t0))//operator ||(func(t0), func(t1))

else

return 0; }

3.1、

c++從語法上支援邏輯操作符過載

3.2、

過載後的邏輯操作符

不滿足短路法則

3.3、

工程開發中

不要過載邏輯操作符

3.4、

通過過載

比較操作符替換邏輯操作符過載        ???

3.5、

通過專用

成員函式替換邏輯操作符的過載

C 學習筆記 第38課 邏輯操作符的陷阱

1.運算元只有兩種值 true和false 2.邏輯表示式不用完全計算就能確定最終值 3.最終結果只能是true或者false include using namespace std class test intvalue const bool operator const test l,const...

38 邏輯操作符的陷阱

邏輯操作符的原生語義 運算元只有兩種值 true和false 邏輯表示式不用完全計算就能確定最終值,最終結果只能是true或者false。邏輯操作符可以過載嗎?include include using namespace std int func int i int main else cout ...

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...