[英]C++ short-circuiting of booleans
我是C ++的新手,並且很好奇編譯器如何處理布爾值的惰性計算。 例如,
if(A == 1 || B == 2){...}
如果A等於1,是否曾經評估過B == 2部分?
不,不評估B==2
部分。 這稱為短路評估 。
編輯:正如Robert C. Cartaino正確指出的那樣 ,如果邏輯運算符超載,則不會進行短路評估(話雖如此,為什么有人會使邏輯運算符超載不在我的范圍內)。
除非||
運算符已重載 ,將不對第二個表達式求值。 這稱為“短路評估”。
在邏輯AND(&&)和邏輯OR(||)的情況下,如果第一個表達式足以確定整個表達式的值,則不會對第二個表達式求值。
在上述情況下:
if(A == 1 || B == 2) {...}
...第二個表達式將不被評估,因為
TRUE || ANYTHING
TRUE || ANYTHING
,始終求值為TRUE
。
同樣
FALSE && ANYTHING
始終評估為FALSE
,因此這種情況也會引起短路評估 。
&&
和||
操作員。 B == 2部分未評估。
小心! 不要在那邊放++ B == 2之類的東西!
C ++對布爾表達式求值應用了短路 ,因此,永遠不會求值B == 2
,並且編譯器甚至可能完全忽略它。
編譯器通過生成中間跳轉來處理此問題。 對於以下代碼:
if(A == 1 || B == 2){...}
編譯為偽匯編器,可能是:
load variable A
compare to constant 1
if equal, jump to L1
load variable B
compare to constant 2
if not equal, jump to L2
L1:
... (complete body of if statement)
L2:
(code after if block goes here)
不,這不對。
與&&
相同,如果其中一個錯誤,則不必理會另一個。
B == 2
永遠不會評估。
有關更多信息,請參見短路評估 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.