簡體   English   中英

布爾的C ++短路

[英]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 ,因此這種情況也會引起短路評估

幾個快速筆記

  • 短路評估不適用於過載的&&|| 操作員。
  • 在C ++中,可以保證第一個表達式將首先被求值。 某些語言不保證評估順序,VB根本不進行短路評估。 知道是否要移植代碼很重要。

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)

正如James所說,這是短路評估 惰性評估是完全不同的東西。

不,這不對。

&&相同,如果其中一個錯誤,則不必理會另一個。

B == 2永遠不會評估。

有關更多信息,請參見短路評估

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM