簡體   English   中英

Java布爾表達式行為

[英]Java Boolean expression behavior

這是我在這里發表的第一篇文章,請原諒任何協議錯誤。

我的問題只是試圖通過以下Java代碼來了解正在發生的事情。 我完全理解括號的使用會澄清一切,但結果輸出似乎是在面對有關Java操作順序的約定時出現的。

public class Tester
{
   public static void main(String[] args)
   {
    int total=9, num=13;
    if (total>4 || ++num>15 && total>0)
    {
           System.out.println("short");
    }
    System.out.println(num);
   }
}

輸出為:短13

顯然++ num沒有執行。 如果觀察到嚴格的操作順序,它應該是第一件事。 它沒有。 接下來就是&&。 如果&&按優先順序超過||完成,則相同的...... ++ num應首先發生。 它沒有。 所以,對我而言,似乎輸出是用||確定的 首先執行, 接++ num,然后使用&&,導致打印。 操作規則的順序是否被忽略,布爾表達式是從左到右執行的? 增量運算符是否導致不規則行為?

感謝您對此代碼實際發生的任何見解。

這與優先級/關聯性(它處理如何解析表達式)無關......這與Java評估順序有關 - 這是從左到右 您似乎誤解了短路邏輯的工作原理。

&&|| 運算符對兩個布爾表達式執行條件AND條件OR運算。 這些運算符表現出“短路”行為,這意味着僅在需要時才評估第二個操作數。


現在,讓我們嘗試逐步評估這個表達式......

total > 4 || ++num > 15 && total > 0

由於total > 4計算結果為true ,因此條件計算結果為true並且立即采用if分支而不是評估條件的其余部分。

如果將total更改為等於4 ,則短路OR的左操作數( total > 4 )為false ,因此它會計算右操作數( ++num > 15 && total > 0 )。

如果將num更改為等於15 ,則短路AND左操作數( ++num > 15 )的計算結果為true ,因此它最終計算AND右操作數( total > 0 )以確定條件是否為true 如果total > 0為false,則條件也為false

下面是為了清晰起見而重寫的代碼,以突出顯示流程。

if (total > 4) {
  System.out.println("short");
} else {
  if (++num > 15) {
    if (total > 0) {
      System.out.println("short");
    }
  }
}
System.out.println(num);

您可以在相關的Java Tutorial中閱讀有關Java條件運算符的更多信息。

通過使用double或(||),可以激活java的短路; (使用單個|如果你不想要這個)。 一旦它到達一切都是真的,並且它遇到短路或(||),(或某些事情是錯誤的,它會發生短路和(&&)),它就會爆發。 所以在你的情況下,total大於4,所以它停在那里(由於||),並返回true到if語句,並打印出short; 它永遠不會到達增加num變量的部分,因為它看不需要檢查它

發生了什么是短路評估 total > 4true ,使整個條件為true 我們甚至不需要在||之后查看后面的內容 這是一種非常常見的運行時優化,也存在於C,C ++和Javascript(以及許多其他)中。 你觀察到它的副作用。

請注意,短路可以用於您的優勢(例如,檢查||&&左側是否為(非) null值)或者它可能會使您混淆(就像您在問題中所做的那樣)。 明智地使用它,年輕的padawan。

計算機將在你的布爾表達式下,如總計> 4 || (++ num> 15 && total> 0)。 它就像標准SQL中的表達式。 它找到&&並在左側和右側抓取2個表達式,然后像我剛才那樣將它們放在一個括號中。 在你的代碼中,total = 9> 4和++ num = 14 <15且total = 9> 0,因此結果為true ||(false && true)= true。 終端打印出“short”和num,即13。

希望我的回答能幫到你。 如果我錯了,請糾正我

我認為在if子句中使用時它不會改變變量的實際值。 存儲在存儲器中的值保持不變。 它就像表達式中的num + 1> 15

暫無
暫無

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

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