簡體   English   中英

短路與非短路運算符

[英]Short circuit vs non short circuit operators

我理解下面的區別(至少對於 Java):

if( true || false ) // short-circuiting boolean operator
if( true | false )  // non-short-circuiting boolean operator

但我的問題是,在處理布爾表達式時是否有任何理由使用非短路運算符? 是否有一些不會被視為不良做法的性能優勢或用途?

您可能想要使用非短路運算符的一個原因是,您是否以某種方式依賴於函數的副作用。 例如。

boolean isBig(String text) {
  System.out.println(text);
  return text.length() > 10;
}

...
if( isBig(string1) || isBig(string2) ){
   ...
}

如果你不關心println是否被執行,那么你應該使用上面的短路操作。 但是,如果您希望始終打印兩個字符串(因此取決於副作用),則需要使用非短路運算符。

實際上,您幾乎總是想使用短路運算符。 依賴表達式中的副作用通常是不好的編程習慣。

一個例外是在非常低級或對性能敏感的代碼中。 短路運算符可能會稍微慢一些,因為它們會導致程序執行中出現分支。 還使用按位運算符允許您將 32 或 64 個並行布爾運算作為單個整數運算進行,這非常快。

如果您的代碼對性能足夠敏感並且操作足夠便宜,則使用非短路可以更快。 這是因為使用|| 涉及執行分支,並且分支預測未命中可能非常昂貴。 哪里作為| 執行計算和檢查變量可以更快,避免分支預測失敗。

注意:這是一個微優化,除非多次調用,否則您很少會看到差異。

short-circuit ,這意味着如果沒有必要,他們不會評估右側。 例如,如果&&左側為假,則無需評估右側。 || 如果 left 為真,則無需評估右側的一個。

non-short短評雙方總是。

那么顯然short-circuit運算符有好處。

且受益非短,可以在這里找到答案。 Java/Scala 中的非短路邏輯(布爾)運算符有很好的用途嗎?

也考慮這個例子

  while (status){ // status is boolean value
          if(!a | result){// a and result are boolean value
              result=getResult(); // result can change time to time
          } 
      }

我們現在需要檢查雙方。

我的問題更側重於尋找使用 | 的好處。 只處理布爾值時

考慮以下情況

while ( !credentialvalid() | (loginAttempts++ < MAX) ) {

    // tell something to user.

}

在這種情況下| 需要,因為我也必須增加嘗試次數:)

唯一不應該使用非短路運算符的地方是當您希望執行第二條語句時,通常在條件語句中不應該出現這種情況

,非短路沒有性能,但短路絕對有好處

如果你使用,

  if(true || /*someStatementHere*/)

那么整個if塊將為真,因為第一個條件為真,所以它不必檢查另一個

簡單地說,如果第一個條件在短路運算符的情況下給出結果,則不會評估右側操作數

第三個聲明

if( 10 | 11 )       // bitwise operator

會產生編譯錯誤。 if 語句中只能放入布爾值。

如果您使用的是 Eclipse 之類的 IDE,它會自動顯示第二個表達式,即 || 之后作為短路布爾運算符的死代碼。

對於簡單的布爾表達式| 有時|| . 有時您希望對表達式進行統一計算(就像索引值中有++

你不能不小心“混合”布爾值| 和按位| 因為你不能混合布爾操作數和整數操作數。 但是你可以(當然)不小心使用| 您打算在何處使用|| . 值得慶幸的是它不是 C,在那里你可能會不小心使用=而不是==

我不知道為什么所有人都說按位只能對布爾操作數進行操作。 我告訴你按位運算符適用於操作數的類型並返回與每個操作數相同類型的值。 只是為了理解,將按位運算符視為可以將 2 個數字相加的數學“+”運算符。 在按位的情況下相同。

if(10 | 11) 不會給出編譯錯誤。 如果結果為 0,則為假,否則為真。

BITWISE OPERATORS 不會短路,因為按位總是需要 2 個操作數才能執行。 小心按位使用 OPERANDS 而不是 Boolean_CONDITIONs

句法:

   for bitwise :  (operand_1) bitwise_operator (operand_2)
                 for example: ( 2 ) | ( 3 )

   for LOGICAL :  (Boolean_condition_1) LOGICAL_operator (Boolean_condition_2)
                 for example: ( true ) || ( false )

暫無
暫無

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

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