&&和||是c++中非常特殊的操作符 ,&&和||內建實現了短路規則 ,操作符過載是靠函式過載來完成的 ,運算元作為函式引數傳遞 ,c++的函式引數都會被求值,無法實現短路規則 。所以一般情況下不會過載邏輯與和邏輯或。
下面就用乙個案例來分析為什麼不要過載邏輯或和邏輯與。
#include
class test8
bool
operator&&(test8 &obj)
private:
int m_a;
};int main()
過載的函式可以進行邏輯與的操作,對結果沒有什麼影響,但是我們卻無法模擬出邏輯與真正執行的過程,上面程式中,如果不是使用過載的&&,而是單純進行數字計算,即定義整形資料a = 10,b = 0, c = 30;然後進行b&&(a = c)的操作,此時的結果是b = 0, a = 10, c = 30;很明顯後面的賦值操作a = c 是沒有執行的,這就是內建邏輯與的短路原則,當&&前的是為0時,就結束了不再執行後面的操作了;
而如果使用過載的函式,對物件進行&&操作,此時的結果就是a = 30, b = 0, c = 30,可以發現後面的賦值操作是執行了的,為什麼呢?
我們知道,&&的過載是通過函式過載來完成的,運算元作為函式引數傳遞,那麼上面的b&&(a = c)操作就可以改寫為b.operator&&(a = c)
很顯然這個過程不會有短路原則。所以過載的&& 操作符並不是真正意義上的&&操作,同樣的||操作符也是這樣的,所一般情況下不要過載&&和||操作符。
js中的邏輯與( )和邏輯或( )
結果為true時 取最後一項的值 結果為false時 去第乙個為false的值 結果為true時 取 第乙個為true的值 結果為false時 取最後一項的值 var aa 1 2 3 4 4 整個表示式為true 返回 最後一項 var bb 1 2 null undefined 4 null 整...
js中的邏輯與( )和邏輯或( )
發布者 博主 在2014年9月13日 在js中寫出如下的答案 var a 2 var b 3 var andflag a b var orflag a b 問andflag 和orflag 分別是什麼?起初我認為 andflag 和orflag 的值都為 true 畢竟 和 都是求boolean 後...
邏輯與和邏輯或的短路運算
短路運算 var a 1 var b 2 console.log a b 列印1 var a var b 2 console.log a b 列印2 var a 1 var b console.log a b 列印1 如果左邊為真 就先輸出左邊的值 如果左邊為假 就先輸出右邊的值 短路運算 var ...